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

  怎么叫更加容易使用呢?多个方法变成一个方法,在外观看来,只需知道这个功能完成哪些功能就OK了,不必记得一大堆对象,一大堆方法。

  外观模式UML图:

    

  外观模式的基本结构代码:

namespace ConsoleApplication1
{//四个子系统类class SubSystemOne{public void MethodOne(){Console.WriteLine("子系统方法一");}}class SubSystemTwo{public void MethodTwo(){Console.WriteLine("子系统方法二");}}class SubSystemThree{public void MethodThree(){Console.WriteLine("子系统方法三");}}class SubSystemFour{public void MethodFour(){Console.WriteLine("子系统方法四");}}//外观类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()       //这样相对于外部来说,调用MethiodA方法就等于同时调用了3个方法,但外观看起来是一个方法
        {Console.WriteLine("\n方法组A()");one.MethodOne();two.MethodTwo();four.MethodFour();}public void MethodB(){Console.WriteLine("\n方法组B()");  two.MethodTwo();three.MethodThree();}}class Program{static void Main(string[] args){Facade facade = new Facade();facade.MethodA();facade.MethodB();Console.ReadKey();}}
}

  回到《大话设计模式》里的买股票例子:

namespace ConsoleApplication1
{//股票1class Stock1{//卖股票public void Sell(){Console.WriteLine("股票1卖出");}//买股票public void Buy(){Console.WriteLine("股票1买入");}}//股票2class Stock2{//卖股票public void Sell(){Console.WriteLine("股票2卖出");}//买股票public void Buy(){Console.WriteLine("股票2买入");}}//股票3class Stock3{//卖股票public void Sell(){Console.WriteLine("股票3卖出");}//买股票public void Buy(){Console.WriteLine("股票3买入");}}//国债1class NationalDebt1{//卖国债public void Sell(){Console.WriteLine("国债1卖出");}//买国债public void Buy(){Console.WriteLine("国债1买入");}}//房地产1class Realty1{//卖出房产public void Sell(){Console.WriteLine("房产1卖出");}//买房产public void Buy(){Console.WriteLine("房产1买入");}}class Fund{Stock1 gu1;Stock2 gu2;Stock3 gu3;NationalDebt1 nd1;Realty1 rt1;public Fund(){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();}}class Program{static void Main(string[] args){Fund jijin = new Fund();//基金购买
            jijin.BuyFund();//基金赎回
            jijin.SellFund();Console.ReadKey();}}
}

  如何使用外观模式:

  首先,在设计初期阶段,应该要有意识的将不同的两个层分离,比如经典的三层架构,就需要考虑在数据访问层和业务逻辑层、业务逻辑层和表示层的层与层之间建立外观Facade,这样可以为复杂的子系统提供一个简单的接口,使得耦合大大降低。

  其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂。大多数模式的使用时也会产生很多很小的类,这本是好事,但也给外部调用它们的用户程序带来了使用上的困难,增加外观Facade可以提供一个简单的接口,减少它们之间的依赖。

  最后,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,但因为他包含非常重要的功能,新的需求开发必须要依赖于它。此时用外观模式Facade也是非常合适的。你可以为新系统开发一个外观Facade类,来提供设计粗糙或高难度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂工作。

外观模式 - 设计模式学习相关推荐

  1. Facade模式——设计模式学习笔记

    Facade模式 一 意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 二 动机 将一个系统划分成为若干个子系统有利于降低系统的复 ...

  2. 桥接模式 - 设计模式学习

    合成/聚合复用原则(CARP),尽量使用合成/聚合,尽量不要使用类继承. 合成和聚合都是关联的特殊种类.聚合表示一种弱的"拥有关系",体现的是A对象可以包含B对象,但B对象不一定是 ...

  3. 设计模式学习笔记清单

    设计模式学习笔记清单 关于设计模式许多人已经耳熟能详,这段时间结合李建忠的教学视频以及大量网络资料,把这部分过了一遍,整理出学习笔记,而真正的深入学习和理解只能在具体的开发环境中日积月累.      ...

  4. 设计模式学习笔记汇总目录

    这里的学习笔记包含JavaSE和J2EE两部分,持续更新中! 其中关于学习的参考资料如下: 1.菜鸟设计模式 2.Head First Design Patterns(书.强烈推荐); 3.大话设计模 ...

  5. Java设计模式学习 - 模版方法模式策略模式

    个人博客项目地址 希望各位帮忙点个star,给我加个小星星✨ 设计模式-模板方法&策略模式 简单介绍 模板方法模式(Template):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. ...

  6. 外观模式coding

    外观模式也叫门模式,这个模式非常简单,也容易理解,我们先创建结构性模式的一个包,还记得我们之前学过迪米特法则吗,也叫最少知道法则,你外观模式是迪米特法则非常好的典型例子,降低我们应用层与子系统类之间的 ...

  7. 设计模式学习笔记——外观(Facade)模式

    设计模式学习笔记--外观(Facade)模式 @(设计模式)[设计模式, 外观模式, facade] 设计模式学习笔记外观Facade模式 基本介绍 外观案例 类图 实现代码 Database类 ma ...

  8. 设计模式学习系列9 外观模式Facade

    1.概述 自己卖了一辆越野自行车,但毕竟不是自己定制的,买回来之后可能需要更改一下脚蹬,座皮,里程计数器或者刹车系统,假如将自行车看做一个整体系统,对我们而言使用的是自行车,然后我们对自己车构件的修改 ...

  9. Java设计模式学习总结(12)——结构型模式之外观模式

    外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这种模式涉及 ...

最新文章

  1. 你负责选歌,索尼负责用 AI 谱出风格相似的曲子
  2. zabbix监控交换机出图断断续续
  3. Winupdatelist
  4. python003 一 Python起步、pyhthon运行方式、语法结构、python变量
  5. 奇迹觉醒服务器找不到,奇迹MU觉醒与服务器断开连接 原因及解决办法
  6. PHP新增与修改的区分
  7. 坚持不放弃,修得好结果。
  8. 通过注册表修改远程桌面默认3389端口
  9. python对象三个特性_python面向对象的三大特性
  10. Windows Server 2008 部署权限管理RMS
  11. 广东发布全国首批“网络视听产业试点机构”名单 虎牙获001号授牌
  12. 微软架构师谈编程语言发展
  13. 奇安信RSA观察|RSAC应用安全技术新风向
  14. channel c3 disabled, job failed on it will be run on another channel
  15. SQL中char、varchar、nvarchar、text 的区别
  16. 华为最新解bl解锁码计算工具_黔隆科技刷机教程红米note4X低配版忘记密码刷机解锁降级救砖解屏幕锁账户锁教程...
  17. Opera系统Oracle,超详细的酒店Opera系统中英讲解1
  18. 【音频处理】Melodyne 网络缩放功能 ( 音符分离线 | 片段分离线 | 窗口滚动条 | 网格缩放 | 修改图像显示位置 | 显示五线谱 )
  19. 组合数学与计算机科学书籍,计算机科学丛书:组合数学(原书第5版)
  20. ARMv7 Processor modes

热门文章

  1. ArrayList的subList方法
  2. 完整复现何恺明ICCV获奖论文结果并开源 !(附论文开源代码)
  3. Docker 安装registry (构建私有镜像库)
  4. html5移动端根据百度地图api获取详细地址
  5. HDFS之SequenceFile和MapFile
  6. 【完结】利用 Composer 完善自己的 PHP 框架(三)——Redis 缓存
  7. Smokeping图表参数说明
  8. [python] 从GPS坐标获取国家名
  9. php 使用curl模拟登录discuz以及模拟发帖
  10. 我的家庭私有云计划-16