1.概述

自己卖了一辆越野自行车,但毕竟不是自己定制的,买回来之后可能需要更改一下脚蹬,座皮,里程计数器或者刹车系统,假如将自行车看做一个整体系统,对我们而言使用的是自行车,然后我们对自己车构件的修改对于我们的使用而言并没有什么影响。在软件里面一个大型系统需要分割为多个不同的子系统组成,可能回派分给不同的人去完成,对于我们整个系统顶层实现而言,我们只用关注子系统提供的接口即可,而不用去处理子系统的细节,并且尽量去降低每个子系统之间的关系对于后面的扩展肯定是更好的。从面向对象的角度而言,我们需要每个子系统之间的耦合行最低并且子系统的更改尽量不会去更改顶层代码,这时候我们就需要外观模式来完成这个人物。

2.外观模式定义

外观模式定义为子系统中的一组接口提供一个一致的界面, 这个接口使得这一子系统更加容易使用。引入外观角色之后,用户只需要直接与外观角色交互,用户与子系统之间的复杂关系由外观角色来实现,从而降低了系统的耦合度。

(1)适用情况

  • 构件一个层次的系统时,子系统接口通过外观模式定义
  • 为复杂系统提供一个简单的接口,满足子系统变化对顶层结构无影响
  • 客户端与抽象类之间依赖性太强

(2)优缺点

优点:

  • 减少客户端与子系统之间的耦合度,减少客户端处理的数目,子系统的变化不会影响到客户端的代码。
  • 降低模块之间的编译依赖性

缺点:

  • 只能处理单一的子系统,如果引入新的子系统,则需要修改整个客户端代码。

3.C++实现

 
//外观模式
 
#include "iostream"
using namespace std;
 
class SubSystem1
{
public:
    void Action()
    {
        cout << "子系统1" << endl;    
    }        
};
 
 
class SubSystem2
{
public:
    void Action()
    {
        cout << "子系统2" << endl;    
    }        
};
 
class Facede
{
private:
    SubSystem1* pSubSystem1 ;
    SubSystem2* pSubSystem2 ;
public:
    Facede():pSubSystem1(0),pSubSystem2(0)
    {
        pSubSystem1 = new SubSystem1 ;
        pSubSystem2 = new SubSystem2 ;        
    }
    ~Facede()
    {
        if(pSubSystem1 != 0)
            delete pSubSystem1 ;
 
        if(pSubSystem2 != 0)
            delete pSubSystem2 ;            
    }
    
    void Action()
    {
        cout << "系统执行" << endl;    
        pSubSystem1->Action();
        pSubSystem2->Action();         
    }        
};
 
 
int main()
{
    Facede* pFacede = new Facede ;
    pFacede->Action();
    delete pFacede;
    
    return 1; 
}
 

4.扩展:抽象外观模式

外观模式中需要对子系统进行删除,增加,修改的时候就需要对外观接口以及里面的子类进行修改,遮掩归咎违背了面向对象的“开放闭合原则”,抽象外观模式可以避免这个问题的问题。 抽象外观模式增减一个抽象外观的基类,当对当前的子系统进行修改时可通过新的外观模式类来实现新的接口。

图中增加了新的SubsystemC子类,这个时候不用去修改原有接口,只用重新增加一个新的接口接口。

5参考

http://blog.csdn.net/hguisu/article/details/7533759

http://blog.csdn.net/lovelion/article/details/8259789

细雨淅淅 标签: 设计模式

设计模式学习系列9 外观模式Facade的更多相关文章

  1. 设计模式学习系列6 原型模式(prototype)

    原型模式(prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.允许一个对象再创建另外一个新对象的时候根本无需知道任何创建细节,只需要请求圆形对象的copy函数皆可. 1 ...

  2. 设计模式(九)外观模式Facade(结构型)

    设计模式(九)外观模式Facade(结构型) 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ...

  3. 设计模式(二)-- 外观模式(Facade)

    设计模式(二) 外观模式(Facade) 为了解决子系统外部的客户端在使用子系统的时候,既能简单地使用这些子系统内部的模块功能,而又不用客户端去与子系统内部的多个模块交互的问题. 为子系统中的一组接口 ...

  4. 设计模式系列之外观模式(Facade Pattern)——提供统一的入口

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  5. 【转】设计模式(九)外观模式Facade(结构型)

    设计模式--外观模式Facade(结构型): 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ...

  6. Java设计模式菜鸟系列(九)外观模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39805735 外观模式(Facade):是为了解决类与类之间的依赖关系的,像spring一 ...

  7. 研磨设计模式学习笔记2--外观模式Facade

    需求:客户端需要按照需求,执行一个操作,操作包括一个系统中的3个模块(根据配置选择是否全部执行). 外观模式优点: 客户端无需知道系统内部实现,,只需要写好配置文件,控制那些模块执行,简单易用. 外观 ...

  8. Headfirst设计模式的C++实现——外观模式(Facade)

    light.h #ifndef _LIGHT_H_ #define _LIGHT_H_ #include <iostream> class LIGHT { public: void dim ...

  9. Java设计模式(11)外观模式(Facade模式)

    外观模式(Facade)的定义:为子系统中的一组接口提供一个一致的界面. Facade一个典型应用就是数据库JDBC的应用,如下例对数据库的操作: public class DBCompare { C ...

随机推荐

  1. 5.建造者模式(Builder Pattern)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. iOS开发网络篇—网络请求(HTTP协议)小结(转)

    1. 聊一下HTTP协议(协议的完整的通信过程) 2.通信过程 1> 请求 * 客户端 --> 服务器 * 请求的内容 a. 请求行(请求方法\HTTP协议\请求资源路径) b. 请求头( ...

  3. GitHub在Visual Studio 2015中获得TFS/VSO同等地位

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 在Visual Studio 2015中微软为GitHub提供了扩展插件,从而让GitHub ...

  4. Windows下64位Apache服务器的安装

    转自:http://www.blogjava.net/greatyuqing/archive/2013/02/13/395308.html 首先需要说明的是,Apaceh服务器没有官方的64位版本,只 ...

  5. C++ 学习的网站

    C++入门教程:  http://see.xidian.edu.cn/cpp/biancheng/cpp/rumen/

  6. Xamarin.iOS调试提示需要iOS SDK

    Xamarin.iOS调试提示需要iOS SDK   错误信息:The version of Xamarin.iOS requires th iOS 9.3 SDK (shipped with Xco ...

  7. HDU4276 The Ghost Blows Light(树形DP+背包)

    题目大概说一棵n个结点树,每个结点都有宝藏,走过每条边要花一定的时间,现在要在t时间内从结点1出发走到结点n,问能获得最多的宝藏是多少. 放了几天的题,今天拿出来集中精力去想,还是想出来了. 首先,树 ...

  8. POJ2686 Traveling by Stagecoach(状压DP+SPFA)

    题目大概是给一张有向图,有n张票,每张票只能使用一次,使用一张票就能用pi匹马拉着走过图上的一条边,走过去花的时间是边权/pi,问从a点走到b点的最少时间是多少. 用dp[u][S]表示当前在u点且用 ...

  9. C# 序列化(Serialize)与反序列化(Deserialize)ZZ

    序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制.其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方. .NET框架提供了两种种串行化的方式:1. ...

  10. BZOJ4299 : Codechef FRBSUM

    若$[0,i]$的数都可以得到,那么$[1,所有不大于i+1的数的和]$的数都可以得到. 如此暴力枚举答案,用可持久化线段树支持查询,因为每次数字至少翻一倍,所以复杂度为$O(m\log^2n)$. ...