外观模式:

为子系统中的一系列接口提供了一个统一的界面。外观模式定义了一个高层次的接口以使子系统更加easy使用。

Provide a unified interface to a set of interfaces in a subsystem.
Façade defines a higher-level interface that makes the subsystem easier to use.

UML图:

主要包含:

  1. Facade(MortgageApplication):了解每一个子系统负者的功能;将client的请求分发给合适的子系统。
  2. SubSystem classes(Bank,Credit,Loan):实现子系统的功能。处理Facade指定的业务,这个类中没有Facede类的信息。

C++代码实现:

#include <iostream>

class SubSystem1
{
public:
void method1()
{
std::cout<<"SubSystem1::method1 invoke"<<std::endl;
}
}; class SubSystem2
{
public:
void method2()
{
std::cout<<"SubSystem2::method2 invoke"<<std::endl;
}
}; class SubSystem3
{
public:
void method3()
{
std::cout<<"SubSystem3::method3 invoke"<<std::endl;
}
}; class Facade
{
public:
Facade()
{
subSystem1=new SubSystem1();
subSystem2=new SubSystem2();
subSystem3=new SubSystem3();
}
void methodA()
{
std::cout<<"Facade methodA include:"<<std::endl;
subSystem1->method1();
subSystem2->method2();
}
void methodB()
{
std::cout<<"Facade methodB include:"<<std::endl;
subSystem1->method1();
subSystem3->method3();
}
~Facade()
{
if(subSystem1!=NULL)
delete subSystem1;
if(subSystem2!=NULL)
delete subSystem2;
if(subSystem3!=NULL)
delete subSystem3;
}
private:
SubSystem1 * subSystem1;
SubSystem2 * subSystem2;
SubSystem3 * subSystem3;
}; int main()
{
std::cout<<"外观模式測试"<<std::endl;
Facade * facade=new Facade;
facade->methodA();
facade->methodB();
delete facade;
return 0;
}

运行结果:

一个详细的样例:

Facade为Morgage,这个类用来推断是否能对客户抵押贷款(依据客户的银行账户,行用卡记录,贷款记录来推断)。

SubSystem包含Bank(即客户的银行账户是否满足要求),Credit(客户的信用卡是否符合要求),Loan(客户的是否存在不良贷款记录)。

C++代码例如以下:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string>
using namespace std;
class Customer
{
public:
Customer(string str=""):name(str)
{ }
string getName() const
{
return name;
}
void setName(string str)
{
name=str;
} private:
string name; }; class Bank
{
public:
bool hasSufficientSavings(Customer c,int amount)
{
std::cout<<"check bank for "<<c.getName()<<std::endl;
return true;
}
}; class Credit
{
public:
bool hasGoodCredit(Customer c)
{
std::cout<<"check credit for "<<c.getName()<<std::endl;
return true;
}
}; class Loan
{
public:
bool hasNoBadLoans(Customer c)
{
std::cout<<"check loans for "<<c.getName()<<std::endl;
return true;
}
}; class Mortgage
{
public:
Mortgage()
{
bank=new Bank;
credit=new Credit;
loan=new Loan;
}
bool isEligible(Customer c, int amount)
{
std::cout<<c.getName()<<" applies for "<<amount<<std::endl;
bool eligible=true;
if(!bank->hasSufficientSavings(c,amount))
{
eligible=false;
}
else if(!credit->hasGoodCredit(c))
{
eligible=false;
}
else if(!loan->hasNoBadLoans(c))
{
eligible=false;
} return eligible; }
~Mortgage()
{
if(!bank)
delete bank;
if(!credit)
delete credit;
if(!loan)
delete loan;
}
private:
Bank * bank;
Credit *credit;
Loan * loan;
}; int main()
{
std::cout<<"外观模式详细样例"<<std::endl;
Mortgage *mortgage=new Mortgage();
Customer c(string("John"));
bool eligible =mortgage->isEligible(c,25000); std::cout<<c.getName()<<" has been "<<(eligible? "approve":"reject")<<std::endl;
return 0;
}

运行结果:

外观模式是一个对迪米特法则非常好的应用。

迪米特法则:

假设两个类不必直接通信,那么这两个类就不应当发生直接的相互作用。假设当中一个类须要调用还有一个类的某一个方法的话。能够通过第三者转发这个调用。

这也是减少耦合性的思想。

设计模式之八:外观模式(Facade)的更多相关文章

  1. 乐在其中设计模式(C#) - 外观模式(Facade Pattern)

    原文:乐在其中设计模式(C#) - 外观模式(Facade Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 外观模式(Facade Pattern) 作者:webabcd 介绍 ...

  2. 8.4 GOF设计模式三: 外观模式 Facade

    GOF设计模式三: 外观模式 Facade  “现有系统”功能强大.复杂,开发“新系统”需要用到其中一部分,但又要增加一部 分新功能,该怎么办?4.1 Facade Pattern: Key Fea ...

  3. 二十四种设计模式:外观模式(Facade Pattern)

    外观模式(Facade Pattern) 介绍为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.示例有一个Message实体类,某对象对它 ...

  4. [设计模式] 10 外观模式 facade

    外观模式应该是用的很多的一种模式,特别是当一个系统很复杂时,系统提供给客户的是一个简单的对外接口,而把里面复杂的结构都封装了起来.客户只需使用这些简单接口就能使用这个系统,而不需要关注内部复杂的结构. ...

  5. 设计模式 笔记 外观模式 Facade

    //---------------------------15/04/16---------------------------- //Facade 外观模式-----对象结构型模式 /* 1:意图: ...

  6. 设计模式之外观模式(Facade)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  7. 【设计模式】—— 外观模式Facade

    前言:[模式总览]——————————by xingoo 模式意图 外观模式主要是为了为一组接口提供一个一致的界面.从而使得复杂的子系统与用户端分离解耦. 有点类似家庭常用的一键开关,只要按一个键,台 ...

  8. 结构型设计模式之外观模式(Facade)

    结构 意图 为子系统中的一组接口提供一个一致的界面,F a c a d e 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 适用性 当你要为一个复杂子系统提供一个简单接口时.子系统往往因 ...

  9. Java学习笔记——设计模式之八.外观模式

    外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 子系统: package cn.happy.design_patter ...

  10. python : 设计模式之外观模式(Facade Pattern)

    #为啥要用外观模式举例说明 这个例子很形象,直接从人家博客上贴过来的,参考链接在下面 不知道大家有没有比较过自己泡茶和去茶馆喝茶的区别,如果是自己泡茶需要自行准备茶叶.茶具和开水,如图1(A)所示,而 ...

随机推荐

  1. java实验7-多线程编程

    1 利用Thread和Runnable创建线程 [实验目的] (1)理解用实现Runnable接口的方法实现多线程. (2)掌握线程优先级的设置. (3)加深对线程状态转换的理解. [实验要求] 要求 ...

  2. Unity 触屏缩放模型

    现在的手机都是触屏控制的,那么在游戏中我们想通过手指在屏幕上滑动捕获相应的动作呢?Unity官网API中提供了Input类和Touch类,在该类里提供了许多接口.相信只要我们稍微看下,就可以自己应用了 ...

  3. [转] iOS使用NSMutableAttributedString 实现富文本(不同颜色字体、下划线等)

    转自: 在iOS开发中,常常会有一段文字显示不同的颜色和字体,或者给某几个文字加删除线或下划线的需求.之前在网上找了一些资料,有的是重绘UILabel的textLayer,有的是用html5实现的,都 ...

  4. EF数据建模(一)

    大中型软件开发过程中常会使用ORM技术,ORM全称是“对象-关系映射Object-Relation-Mappping”.是将数据库中的数据对象的形式表现出来,并将通过面向对象的方式将这些对象组织起来, ...

  5. C#调用C++的DLL 数据类型转换

    /C++中的DLL函数原型为        //extern "C" __declspec(dllexport) bool 方法名一(const char* 变量名1, unsig ...

  6. win7_64位主机装虚机Linux系统(VMware Workstation10+CentOS6.5)详细步骤图文讲解

    第一步:创建新的虚拟机 第二步:选择“典型”安装 第三步:选择映像文件安装—浏览选择iso文件 第四步:选择稍后安装操作系统 第五步:系统选择Linux,版本选择centOS64位 第六步:虚拟机名称 ...

  7. C++Primer笔记(3)

    标准库类型string表示可变长的字符序列,使用前先包含string头文件.(哈哈,终于可以逃脱C语言中的str函数系列了.)因为是标准库的一部分,所以string被定义在命名空间std中.所以你懂该 ...

  8. redis之lua脚本

    背景介绍 redis数据库提供了一些管理功能比如 流水线:打包发送多条命令,并在一个回复里面接收所有被执行命令的结果.事务:一次执行多条命令,被执行的命令要么就全部都被执行,要么就一个也不执行.并且事 ...

  9. JS+css滑动菜单简单实现

    JS+css滑动菜单 制作一个简单的滑动菜单,当鼠标指向菜单标题时,滑出二级菜单.移开时二级菜单隐藏.目标很简单,实践时有一些细节需要注意,比如鼠标移向二级菜单的 过程中,二级菜单消失了.还有定位出错 ...

  10. 手机QQ v4.2 有感

    因为经常宅宿舍,很少出门,所以无论微信还是手机QQ都很少使用. 刚好最近见别人发来的表情我的2012自改版QQ总是无法解析,只能显示[吼叫].[啦啦]之类的字符,于是更新了v4.2的手机QQ把玩一番, ...