`
gstarwd
  • 浏览: 1525286 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

facade pattern

阅读更多

facade是我學到的第三個pattern,也是個很簡單的pattern,主要是將眾多class重新包裝成一個更好用的class。

Intent
替子系統裡的一堆介面定義一套統一的高階介面,讓子系統更易使用。

Introduction
Facade常用在兩個地方,第一種用法是將原來程序導向的系統,利用Facade包成OO,如MFC包裝Win32 API,第二種用法是將原來複雜的OO系統,再包成更簡單的OO,如.NET Enterprise Library將.NET Framework再做一次包裝,讓你更容易使用.NET。另外3-tier也是典型Facade的應用,DAL(Data Access Layer)就是一個Facade,讓BLL(Business Logic Layer)在存取資料時,不用對付ADO.NET複雜的機制,只需面對DAL即可。

Sample Code
如我們坐捷運買票,目前的賣票的機器只能吃銅板,所以得另外的提供換鈔機,讓旅客將紙幣換成銅板,也就是說,若一個旅客身上只有紙幣又要賣捷運票,他必須做兩個步驟,先將紙幣換成銅板,再用銅板去買車票。

 1/**//* 
 2(C) OOMusou 2007 http://oomusou.cnblogs.com
 3
 4Filename    : DP_FacadePattern1_before.cpp
 5Compiler    : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
 6Description : Demo how to use Facade pattern (before)
 7Release     : 04/24/2007 1.0
 8*/

 9#include <iostream>
10
11using namespace std;
12
13struct Bill {
14  int value;
15  Bill(int value) : value(value) {}
16}
;
17
18struct Coin {
19  int value;
20  Coin(int value) : value(value) {}
21}
;
22
23class BillToCoinMachine {
24public:
25  Coin getCoin(Bill bill) {
26    return Coin(10);
27  }

28}
;
29
30class CoinToTicketMachine {
31public:
32  void getTicket(Coin coin) {
33    cout << "Get ticket" << endl;
34  }

35}
;
36
37int main() {
38  BillToCoinMachine machine1;
39  Coin coin = machine1.getCoin(Bill(100));
40  
41  CoinToTicketMachine machine2;
42  machine2.getTicket(coin);
43}


執行結果

Get ticket


但對於旅客來說,似乎太嫌麻煩,買個票要排兩次隊,若我們能設計一部機器,能吃紙鈔,且能購票,那對旅客將非常的方便。事實上,我們並不需重新設計這樣的機器,只要將這兩台機器整合成一台即可。

 1/**//* 
 2(C) OOMusou 2007 http://oomusou.cnblogs.com
 3
 4Filename    : DP_FacadePattern1_after.cpp
 5Compiler    : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
 6Description : Demo how to use Facade pattern (after)
 7Release     : 04/24/2007 1.0
 8*/

 9#include <iostream>
10
11using namespace std;
12
13struct Bill {
14  int value;
15  Bill(int value) : value(value) {}
16}
;
17
18struct Coin {
19  int value;
20  Coin(int value) : value(value) {}
21}
;
22
23class BillToCoinMachine {
24public:
25  Coin getCoin(Bill bill) {
26    return Coin(10);
27  }

28}
;
29
30class CoinToTicketMachine {
31public:
32  void getTicket(Coin coin) {
33    cout << "Get ticket" << endl;
34  }

35}
;
36
37class TicketMachineFacade {
38public:
39  void coinToTicket(Coin coin) {
40    CoinToTicketMachine machine;
41    machine.getTicket(coin);
42  }

43  
44  void billToTicket(Bill bill) {
45    BillToCoinMachine machine1;
46    Coin coin = machine1.getCoin(bill);
47    
48    CoinToTicketMachine machine2;
49    machine2.getTicket(coin);
50  }

51}
;
52
53int main() {
54  TicketMachineFacade TMFacade;
55  TMFacade.billToTicket(Bill(100));
56  TMFacade.coinToTicket(Coin(10));
57}


執行結果

1Get ticket
2Get ticket


可以看到client的程式明顯乾淨多了

int main() {
  TicketMachineFacade TMFacade;
  TMFacade.billToTicket(Bill(
100));
  TMFacade.coinToTicket(Coin(
10));
}


這表示旅客可以用更簡單的方式買票了。

Consequence
1.避免外界觸及子系統的元件,降低外界所要面對的物件數量,讓子系統更容易使用。

2.促成外界與子系統之間的低偶合性。在子系統裡,元件之間的耦合性往往都很高,降低耦合性會使原件更容易改變而不波及外界。Facade有助於將系統分層、將物件之間的依存關係分層,順便剔除複雜的、循環的依存關係;這對於需要將client和子系統分開製作的專案而言,是非常重要的性質。

對大型軟體系統來說,降低編譯方面的依存關係是非常重要的;子系統一有變動,大家都希望重新編譯的時間能越短越好。只要用Facade降低編譯依存關係,不僅能將重新編譯的動作侷限在一小塊區域,更有利於軟體移植:只是重新編譯一塊子系統,不太需要其他地方也一起再編譯一遍。

3.如有必要,外界仍可直接接觸子系統內的類別,所以你可以在易用性與一般性之間做選擇。

Conclusion
或許你會覺得facade pattern沒什麼,的確,他只是一個概念而已,而且非常單純,但卻常常看的到。

Known use
1..NET Enterprise Library的DAAB
2..NET 2.0的My
3.網路架構的OSI模型

See Also
(原創) 深入探討Altera的Checksum Master範例 (SOC) (SOPC Builder) (Nios II) (DE2)

Reference
GoF,Design Patterns,Addison Weseley ,1995

分享到:
评论

相关推荐

    设计模式之外观模式(Facade Pattern)

    **外观模式(Facade Pattern)**是一种结构型设计模式,它主要解决的是复杂系统或子系统对外暴露一个简单统一的接口,使得客户端无需关心内部复杂的交互细节。这种模式在实际开发中广泛应用,尤其在大型项目中,它能...

    外观模式(Facade Pattern)-结构型模式

    设计模式面面观(13):外观模式(Facade Pattern)-结构型模式 http://blog.csdn.net/fanweiwei/archive/2008/04/17/2299641.aspx

    c++-设计模式之外观模式(Facade Pattern)

    外观模式(Facade Pattern)是一种结构型设计模式,用于为复杂子系统提供一个简单的接口。它通过封装系统内部的复杂性,提供一个统一的接口,使得客户端能够更加方便地使用子系统的功能。这种模式通常用于简化代码、...

    通过python实现外观模式(Facade Pattern).rar

    外观模式(Facade Pattern)是一种结构型设计模式,它为子系统中的一组接口提供一个统一的接口,使得子系统更容易使用。外观模式定义了一个高层接口,使得这一子系统更加容易使用。 压缩包文件代码是一个简单的 ...

    通过C++实现外观模式(Facade Pattern).rar

    在C++中,外观模式(Facade Pattern)同样用于为子系统中的一组接口提供一个统一的接口,使得子系统更容易使用。压缩包文件代码是一个简单的C++实现外观模式的示例。 1、定义各个子系统的类及其接口。 2、定义外观类...

    外观模式 Facade Pattern

    ### 外观模式 (Facade Pattern) #### 概述 外观模式是一种重要的设计模式,属于结构型模式之一。其核心在于通过引入一个简单的接口来隐藏一个系统中存在的复杂性,从而简化了客户端对该系统的使用。该模式的主要...

    FacadePattern.unitypackage

    FacadePattern.unitypackage是C#版设计模式中的外观模式,采用unity举例和C#举例,详细说明了外观模式的用法。

    设计模式 之 “门面模式[Facade Pattern]”

    门面模式(Facade Pattern)是软件工程中一种常用的结构型设计模式,它的主要目的是提供一个统一的接口,用来简化系统中一组复杂的接口或类的使用。这个模式将复杂的子系统接口封装在一个简单的门面对象中,使得...

    通过java实现外观模式(Facade Pattern).rar

    在Java中,外观模式(Facade Pattern)同样用于为子系统中的一组接口提供一个统一的接口,使得子系统更容易使用。压缩包文件代码是一个使用Java实现外观模式的简单示例。 1、定义各个子系统的接口及其实现类。 2、...

    Wrapper facade pattern

    **包装器外观模式(Wrapper Facade Pattern)** 包装器外观模式是一种软件设计模式,它将一个复杂的组件或者一组组件的接口进行简化,提供一个统一的、更易用的访问方式。这种模式通常用于隐藏底层系统的复杂性,为...

    设计模式面面观(14):享元模式(Facade Pattern)-结构型模式

    设计模式面面观(14):享元模式(Facade Pattern)-结构型模式 http://blog.csdn.net/fanweiwei/archive/2008/04/25/2326692.aspx

    解析C#设计模式编程中外观模式Facade Pattern的应用

    外观模式(Facade Pattern)是设计模式中的一种结构型模式,其主要目的是为了简化客户端与复杂系统之间的交互。在C#编程中,外观模式通常用于减少客户端对子系统组件的依赖,提供一个统一的、高层次的接口,使得...

    设计模式之外观模式 facade

    外观模式(Facade Pattern)是设计模式中的一种结构型模式,主要目的是为了解决复杂的系统接口问题,提供一个简单的统一入口,使得客户端可以更方便地使用系统。在Java中,外观模式通常用来隐藏系统的复杂性,对外只...

    [结构型模式] 外观模式的理解

    在给定的文件`FacadePattern.cpp`和`FacadePattern.h`中,我们可以预期看到C++实现的外观模式示例。通常,外观模式包含以下几个关键角色: 1. **外观(Facade)类**:这是对外部世界提供服务的接口,它封装了对子...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    7、门面模式FACADE PATTERN 8、适配器模式ADAPTER PATTERN 9、模板方法模式TEMPLATE METHOD PATTERN 10、建造者模式BUILDER PATTERN 11、桥梁模式BRIDGE PATTERN 12、命令模式COMMAND PATTERN 13、装饰模式...

    C#版 24种设计模式

    适配器模式(Adapter Pattern) 提供者模式(Provider Pattern) 外观模式(Facade Pattern) 享元模式(Flyweight Pattern) 原型模式(Prototype Pattern) 责任链模式(Chain of Responsibility Pattern) 中介者模式...

    常见设计模式的解读和对应代码示例,包括设计原则和软件工程中类之间的依赖关系

    1、基础概念 1.2 类间关系 关联关系(Association) 聚合关系(Aggregation) 组合关系(Composition) 依赖关系(Dependency) 泛化关系(Generalization) ...外观模式(Facade Pattern) 享元模式(Flyweight Pattern)

    C#设计模式_设计模式_C#_

    外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 行为型: 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器模式(Iterator Pattern) 16. 观察者...

Global site tag (gtag.js) - Google Analytics