设计模式之外观模式(Facade)摘录
23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。
Factory Method:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。
Abstract Factory:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
Singleton:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
Builder:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Prototype:用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。
Bridge:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
Adapter:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
Decorator:动态地给一个对象添加一些额外的职责。就扩展功能而言, Decorator模式比生成子类方式更为灵活。
Composite:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得客户对单个对象和复合对象的使用具有一致性。
Flyweight:运用共享技术有效地支持大量细粒度的对象。
Facade:为子系统中的一组接口提供一个一致的界面, Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
Template Method:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
Strategy:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。
State:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。
Observer:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
Memento:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。
Mediator:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
Command:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
Visitor:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
Chain of Responsibility:为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
Iterator:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
Interpreter:给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。
Facade:(1)、意图: 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
(3)、适用性:在遇到以下情况适用Facade模式:A、当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过facade层。B、客户程序与抽象类的实现部分之间存在着很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。C、当你需要构建一个层次结构的子系统时,使用facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过facade进行通讯,从而简化了它们之间的依赖关系。
为子系统的一组接口提供一个一致的界面。使用户使用起来更加方便。
Facade模式在高层提供了一个统一的接口,解耦了系统。设计模式中还有另一种模式Mediator也和Facade有类似的地方。但是Mediator主要目的是对象间的访问的解耦(通讯时候的协议)。
#include <iostream>
#include <string>using namespace std;class SubSysOne
{
public:void MethodOne(){cout<<"方法一"<<endl;}
};class SubSysTwo
{
public:void MethodTwo(){cout<<"方法二"<<endl;}
};class SubSysThree
{
public:void MethodThree(){cout<<"方法三"<<endl;}
};//外观类
class Facade
{
private:SubSysOne* sub1;SubSysTwo* sub2;SubSysThree* sub3;
public:Facade(){sub1 = new SubSysOne();sub2 = new SubSysTwo();sub3 = new SubSysThree();}~Facade(){delete sub1;delete sub2;delete sub3;}void FacadeMethod(){sub1->MethodOne();sub2->MethodTwo();sub3->MethodThree();}
};//客户端
int main()
{Facade* test = new Facade();test->FacadeMethod();/*result方法一方法二方法三*/return 0;
}
Facade.h:
#ifndef _FACADE_H_
#define _FACADE_H_class Subsystem1
{
public:Subsystem1();~Subsystem1();void Operation();
protected:
private:
};class Subsystem2
{
public:Subsystem2();~Subsystem2();void Operation();
protected:
private:
};class Facade
{
public:Facade();~Facade();void OperationWrapper();
protected:
private:Subsystem1* _subs1;Subsystem2* _subs2;
};#endif //~_FACADE_H_
Facade.cpp:
#include "Facade.h"
#include <iostream>using namespace std;Subsystem1::Subsystem1()
{}Subsystem1::~Subsystem1()
{}void Subsystem1::Operation()
{cout<<"Subsystem1 operation ..."<<endl;
}Subsystem2::Subsystem2()
{}Subsystem2::~Subsystem2()
{}void Subsystem2::Operation()
{cout<<"Subsystem2 operation ..."<<endl;
}Facade::Facade()
{this->_subs1 = new Subsystem1();this->_subs2 = new Subsystem2();
}Facade::~Facade()
{delete _subs1;delete _subs2;
}void Facade::OperationWrapper()
{this->_subs1->Operation();this->_subs2->Operation();
}
main.cpp:
#include "Facade.h"
#include <iostream>using namespace std;int main()
{Facade* f = new Facade();f->OperationWrapper();/*resultSubsystem1 operation ...Subsystem2 operation ...*/return 0;
}
外观模式结构图:
参考文献:
1、《大话设计模式C++》
2、《设计模式精解----GoF23种设计模式解析》
3、《设计模式----可复用面向对象软件的基础
设计模式之外观模式(Facade)摘录相关推荐
- 如何让孩子爱上设计模式 ——11.外观模式(Facade Pattern)
如何让孩子爱上设计模式 --11.外观模式(Facade Pattern) 标签: 设计模式初涉 场景引入 相信各位玩过LOL英雄联盟游戏的童鞋,对下面两个英雄都不会陌生吧: 分别是瑞雯和 ...
- 研磨设计模式之外观模式(Facade)(解决方案)
3.2 解决方案 3.2.1 外观模式来解决 用来解决上述问题的一个合理的解决方案就是外观模式.那么什么是外观模式呢? (1)外观模式定义 这里先对两个词进行一下说明,一个是界面,一个是接口. 界 ...
- php facade模,PHP 设计模式之外观模式 Facade
简单描述 外观模式(Facade pattern),为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用. 外观模式又称为门面模式,它是一种对象结构型模式,遵循迪米特法则,又称最少知道原则 ...
- 【设计模式】—— 外观模式Facade
前言:[模式总览]----------by xingoo 模式意图 外观模式主要是为了为一组接口提供一个一致的界面.从而使得复杂的子系统与用户端分离解耦. 有点类似家庭常用的一键开关,只要按一个键,台 ...
- 【白话设计模式二】外观模式(Facade)
为什么80%的码农都做不了架构师?>>> #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...
- 外观模式(Facade)----设计模式
外观模式(Facade)----设计模式 文章目录 外观模式(Facade)----设计模式 什么是外观模式呢? 外观模式的基本介绍 制造一个影院管理? 实现代码 总结 什么是外观模式呢? 以我们中常 ...
- 设计模式:外观模式(Facade)
外观模式(Facade)也叫过程模式, 外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式通过定义一个一致的接口,用以屏蔽内部子系 ...
- 设计模式 -结构型模式_门面模式(外观模式) Facade Pattern 在开源软件中的应用
文章目录 Pre 定义 案例 Demo V1.0 Boss直接管理 V2.0 引入外观类 PmManagerFacade 何时使用Facade Tomcat Mybatis Pre 我们先来回顾下门面 ...
- 设计模式之- 外观模式(Facade Pattern)
外观模式 外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加 ...
最新文章
- c语言中输入位权1,精通C语言程序设计1-编程基础.pptx
- dede频道标签channel和频道内容标签channelartlist的调用栏目名的不同方式,如果错误使用标签会发生错误...
- 家用路由器支持组播吗_组播分布树及其转发模式
- 对象数组 排序-根据其中一个属性
- LeetCode 21 合并两个有序链表
- 阿里开发者招聘节 | 2019阿里巴巴技术面试题分享:20位专家28道题
- 【 HDU - 1796】How many integers can you find (容斥原理,二进制枚举或者dfs)
- Access数据库解密方法大盘点
- 英伟达驱动怎么设置显示帧数?
- 计算机毕业设计Java大学生科技创新项目管理系统(源码+系统+mysql数据库+lw文档)
- 雨滴桌面显示html,如何用雨滴桌面设置美观的桌面天气插件
- 用博客记录成长的历程
- linux 查看kernel log,Linux Kernel Log
- 如何下载微信公众号视频
- Android实现网络视频播放
- SISD、MIMD、SIMD、MISD
- 青春是一场不失不忘的期许
- 虚拟机kali升级最新_kali安装、改变更新源、vmware tools、虚拟机全屏
- 美国B1/B2签证免面试续签流程 2016年5月份更新
- Python的return语句中使用条件判断
热门文章
- Python Qt GUI设计:将UI文件转换为Python文件的三种妙招(基础篇—2)
- 优达学城《DeepLearning》2-3:权重初始化
- JAVA导出exls时报oom_如何实现导出百万条数据到EXCEL中不报OOM异常?
- trainer setup_Detectron2源码阅读笔记-(一)Configamp;Trainer
- canny边缘检测 关于2个阈值参数
- ATS上的hosting.config和volume.config文件解读
- js中substr,substring,indexOf,lastIndexOf的用法
- Photoshop创造氛围照片合成视频教程含素材
- LTE MIBSIB1
- 洛谷P3159 [CQOI2012]交换棋子