一、外观(门面)模式
定义:
为子系统的一组接口提供一个一致(稳定)的界面,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. polyrate使用方法_pytorch必须掌握的的4种学习率衰减策略
  2. 高速串行总线系列(5)总线的各种基础问题
  3. Python小练习:批量删除多个文件夹内的相同文件
  4. 230u拆解 网卡接口_全网首发 HP ProDesk 400 G5 Desktop Mini 九代1L小主机拆解评测
  5. 阿里、腾讯 | 算法岗面试复盘
  6. iText导出pdf、word、图片
  7. 机器学习笔记(二十三):算法精准率、召回率
  8. hibernate还有人用吗
  9. 16种常用的数据分析方法-相关分析
  10. 思潮涌动、静心前行----2020年度博客之星活动经历感悟
  11. Asterisk入门教程
  12. 安卓怎么修改dns服务器,安卓如何修改dns服务器地址
  13. 透明状态栏的实现(Activity里有5个fragment,fragment顶部有图片有纯色的actionbar)
  14. 数据库查询之对含有数字和字母的字段进行排序
  15. @Prometheus监控数据库(MySQL)
  16. 《策略驱动型数据中心——ACI技术详解》一1.3 数据中心设计
  17. 基于帝企鹅算法优化BP神经网络实现数据预测matlab代码
  18. 使用UE4制作RPG类游戏(学习笔记6)(技术笔记5) <刺客信条>
  19. 智能设备时代的个人生命安全
  20. IDEA添加外部插件-yuicompressor压缩js/css

热门文章

  1. python-整数加减和
  2. 李明顺:互联网金融最需要正能量
  3. 互联网时代的营销方法
  4. 学习单片机的第16天—A/D和D/A工作原理(2)
  5. 同个文件夹里怎样保存多个商品链接主图和视频?
  6. 豌豆公主,如何成为日本跨境电商的黑马?
  7. 怎么做加减计算机程序vb,怎样使VB做一个加减乘除小程序,麻烦了,快点啊!!...
  8. [JAVA]第二篇(内存管理,HashMap内存泄漏解决办法)
  9. 多渠道打包方案,其实很有玄机
  10. 第七次人口普查数据背后的玄机,你看懂了吗?