一、外观(门面)模式
定义:
为子系统的一组接口提供一个一致(稳定)的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(复用)。
引例:
把病人和医院作为一个子系统,按照职能,分为挂号、门诊、划价、化验、收费、取药等。
病人与各个部门打交道,不是一件容易的事情。
可以设置一个接待员的位置,有接待员负责代为挂号、取药等。这个接待员就是门面模式的体现。
问题引入:
投资者买股票or基金
(1)投资者买股票,需要了解股票的各种信息,预测他的未来,买入卖出的时机合适,这很难做到,风险反而大。
(2)投资者买基金,基金经理人相对专业,不容易像散户那么盲目,基金经理人用这些钱去做投资,然后大家获利,这体现了软件开发中的什么?
由于众多投资者对众多股票的联系太多,反而不利于操作,这在软件中称为耦合度过高。而有了基金以后,变成了众多用户只和基金打交道,关心基金的上涨和下跌就可以了,实际上的操作却是基金经理人在于上千只股票和其他投资产品打交道。

总结:
从客户程序的角度看,Facade模式简化了整个组件系统的接口,外观模式的外观类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与外观对象打交道。而不需要与子系统内部的很多对象打交道。对于组件内部与外部客户程序来说,达到了一种“解耦”的效果——内部子系统的任何变化不会影响到Facade接口的变化。
Facade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Facade很多时候更是一种架构设计模式。
Facade设计模式并非一个集装箱,可以任意地放进任何多个对象。Facade模式中组件的内部应该是“相互耦合关系比较大的一系列组件”,而不是一个简单的功能集合。
投资基金版本代码结构图:

基金代码:

//股票、国债、房地产代码
class Stock1
{//卖股票public void Sell(){Sysrem.out.println("股票一卖出");}public void Buy(){Sysrem.out.println("股票一买入");}}
class Stock2
{//卖股票public void Sell(){Sysrem.out.println("股票二卖出");}public void Buy(){Sysrem.out.println("股票二买入");}}
class Stock3
{//卖股票public void Sell(){Sysrem.out.println("股票三卖出");}public void Buy(){Sysrem.out.println("股票三买入");}}
class NationalDebt1
{//卖国债public void Sell(){Sysrem.out.println("国债一卖出");}public void Buy(){Sysrem.out.println("国债一买入");}}
class Realty1
{//卖股票public void Sell(){Sysrem.out.println("房地产一卖出");}public void Buy(){Sysrem.out.println("房地产二买入");}}
class Fund
{Stock1 gu1;Stock2 gu2;Stock2 gu3;NationalDebt1 nd1;Realty rt1;public Foud(){gu1=new Stock1();gu2=new Stock2();gu3=new Stock3();nd1=new NationalDebt1();rt1=new Realty1();}public void BuyFund(){gu1.Buy();gu2.Buy();gu3.Buy();nd1.Buy();rt1.Buy();}public void SellFund(){gu1.Sell();gu2.Sell();gu3.Sell();nd1.Sell();rt1.Sell();}
}
public class Program  //客户端代码
{public static void main (String [] args){Fund jijin=new Fund();jijin.BuyFund();jijin.SellFund();}//用户不需要了解股票,甚至可以对股票一无所知,买卖都由基金公司完成。
}

基金类是系统中一组接口的封装界面,也就是高层接口,通过调用高层接口,可以直接调用一组子接口而不需要了解子接口是如何发现的,具有高度保密性和代码复用性。
外观(Facade)角色:
客户端可以调用这个角色的方法,此角色知晓相关的(一个或多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。
基本代码:
四个子系统类

public class SubSystemOne
{public void MethodOne(){System.out.println("子系统方法一");}}
public class SubSystemTwo
{public void MethodTwo(){System.out.println("子系统方法二");}}
public class SubSystemThree
{public void MethodThree(){System.out.println("子系统方法三");}}
public class SubSystemFour
{public void MethodFour(){System.out.println("子系统方法四");}}
//外观类public class Facade{SubSystemOne one;SubSystemTwo two;SubSystemThree three;SubSystemFour four;public Facade(){one =new SubSystemOne();two= new SubSystemTwo();three=new SubSystemThree();four=new SubSystemFour();}public void MethodA(){System.println("\n 方法经A()-----");one.MethodOne();two.MethodTwo();four.MethodFour();}public void MethodB(){System.println("\n 方法经B()-----");two.MethodTwo();three.MethodThree}//客户端调用(由于Facade 的作用,客户端可以不知道四个子系统类的存在):public class program{public static void main(String [] args){Facade facade=new Facade();facade.MethodA();facade.MethodB();}}    }

在外观模式中,通常只需要一个外观类,并且此外观类只有一个实例,换言之他是一个单例类、但整个系统并不是只能有一个外观类,可以有多个(如果有多个子系统)。
外观模式的使用分为三个阶段:
(1)设计初期,有意识将不同的两个层分离,比如经典的三级架构,就需要考虑在数据访问层和业务逻辑层、业务逻辑层和表示层与层之间建立外观Facade,这样可以为复杂的子系统提供一个简单的接口,使耦合度大大降低。
(2)开发阶段,子系统往往因为不断的重构演化而变得很复杂,增加外观Facade可以提供一个简单的接口,减少他们的依赖。
(3)
维护阶段,为新系统开发一个Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰的简单接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂工作。

希望包装或隐藏原有系统:Facade可以把原系统作为自己的私有成员。原有系统与Facade类联系在一起,但使用Facade类的客户无法看到原有的系统。
外观模式的优点
(1)屏蔽了外部客户端和系统内部模板的交互。
(2)Facaed的功能可以被多个客户端调用,可以实现复用
(3)对使用Facaed的人员来说,Facaed大大的节省了他们的学习成本。

设计模式——外观(门面)模式 ,即包装相关推荐

  1. 一看就懂!【英雄联盟锐雯】与 Python 详解设计模式之门面模式

    [网络配图] 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结.使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性.设计 ...

  2. 设计模式之门面模式详解

    设计模式之门面模式详解 文章目录 设计模式之门面模式详解 一.什么是门面模式 二.门面模式的应用场景 三.门面模式的角色组成 四.门面模式通用写法 五.门面模式在业务中的应用 六.门面模式优缺点 一. ...

  3. python设计模式名片_Python设计模式之门面模式简单示例

    本文实例讲述了python设计模式之门面模式.分享给大家供大家参考,具体如下: facade:建筑物的表面 门面模式是一个软件工程设计模式,主要用于面向对象编程. 一个门面可以看作是为大段代码提供简单 ...

  4. 设计模式之【外观/门面模式】,不打开这扇门永远不知道门后有多少东西

    文章目录 一.什么是外观模式(门面模式) 1.外观模式的结构 2.使用场景 3.外观模式的优缺点 4.外观模式注意事项 二.实例 1.外观模式的通用写法 2.智能家居案例 3.积分换礼品案例 参考资料 ...

  5. JAVA设计模式之门面模式(外观模式)

    医院的例子 现代的软件系统都是比较复杂的,设计师处理复杂系统的一个常见方法便是将其"分而治之",把一个系统划分为几个较小的子系统.如果把医院作为一个子系统,按照部门职能,这个系统可 ...

  6. 外观设计模式(门面模式)

    2019独角兽企业重金招聘Python工程师标准>>> 1.门面模式举例,医院设置一个接待员的位置: 病人只接触接待员,由接待员与各个部门打交道 2.门面模式的结构 门面角色会将所有 ...

  7. 设计模式之门面模式与装饰器模式详解和应用

    目录 1 门面模式定义 1.1 门面模式的应用场景 1.2 门面模式的通用写法 1.3 门面模式业务场景实例 1.4 门面模式在源码中的应用 1.5 门面模式的优缺点 2 装饰器模式 2.1 装饰器模 ...

  8. java设计模式之门面模式

    定义: 门面模式又叫做外观模式,提供了一个统一的接口,用来访问子系统中的一群接口.其主要特征是定义了一个高层接口,让子系统更容易使用,属于结构型设计模式 使用场景: 为一个复杂的模式或者子系统提供一个 ...

  9. [C++实现 设计模式(14)] : 门面模式

    文章目录 情景描述 门面模式的定义 门面模式的应用 门面模式的优点 门面模式的缺点 门面模式的是使用场景 门面模式的注意事项 一个子系统可以有多个门面 门面不参与子系统内的业务逻辑 *参考书籍* : ...

  10. 浅谈PHP设计模式的门面模式

    简介: 门面模式又称之为外观模式,属于结构型的设计模式. 用于为子系统中的一组接口提供一致的调用方案.门面模式定义了一个高层接口,引入门面角色之后,只需要直接与门面角色交互,降低了系统的耦合度. 适用 ...

最新文章

  1. linux mysql jdk路径_教大家在如何Centos7系统中安装JDK、Tomcat、Mysql(文末附马哥linux全套视频教......
  2. nvidia 程序安装失败
  3. MYSQL 开启root远程登录权限
  4. shell模拟php多进程从redis获取数据
  5. 泽西岛客户:测试外部呼叫
  6. python 字典添加元素乱序了_Python有序字典的两个小“惊喜”
  7. 基于javaSwing+文本存储的学生信息管理系统设计实现
  8. android finish 判断当前_Android开发,源码分析finish()和onBackPressed()的区别
  9. 常用计算机接口类型,常见的电脑数据接口类型有哪些
  10. Weblogic安装时闪退问题
  11. Power Apps 拍照上传
  12. 基于易班API的Java开发入门教程
  13. LiteOS + PahoMQTT 连接华为云
  14. ▼ 系列 | 漫谈数仓第四篇NO.4 『BI选型』
  15. gulp+webpack工具整合简介
  16. maven java版本过低_maven项目编译运行时提示jdk版本过低问题解决方法
  17. linux单片机用什么数据库,基于ARM-Linux的SQLite嵌入式数据库的研究 -单片机-电子工程世界网...
  18. python学习小组分组程序_【Python】每日一练:学生学习小组分组程序
  19. asterisk拨号规则(包含匹配规则说明)转
  20. Unity3D Soft Mask 软遮罩插件

热门文章

  1. 基于51单片机的自动售货机Proteus仿真
  2. Cytoscape.js 网络图
  3. 异地大文件传输、大文件远程传输便捷方式
  4. PHP对象赋值与克隆
  5. TMS320C645x DSP SRIO寄存器(五)——LSU和其他特殊事件中断
  6. 荣耀8viper4android,[深度]选手名场面盘点之AT篇:初代全能王,当年的泰神真的很强...
  7. PCB叠层及阻抗简要
  8. Mac环境下Jenkins部署Python报错 - ModuleNotFoundError: No module named ‘selenium‘ (已完美解决)
  9. JMM学习之Java实现原子性操作
  10. K8S-安全(认证、授权、准入控制)