好,我们继续讲课。大家都是高智商的人,都写过纸质的信件吧,比如给女朋友写情书什么的,写信的过程大家都还记得吧,先写信的内容,然后写信封,然后把信放到信封中,封好,投递到信箱中进行邮递,这个过程还是比较简单的,虽然简单,这四个步骤都是要跑的呀,信多了还是麻烦,比如到了情人节,为了大海捞针,给十个女孩子发情书,都要这样跑一遍,你不要累死,更别说你要发个广告信啥的,一下子发1 千万封邮件,那不就完蛋了?那怎么办呢?还好,现在邮局开发了一个新业务,你只要把信件的必要信息高速我,我给你发,我来做这四个过程,你就不要管了,只要把信件交给我就成了。我们的类图还是从最原始的状态开始:

在这中环境下,最累的是写信的人,为了发送一封信出去要有四个步骤,而且这四个步骤还不能颠倒,你不可能没写信就把信放到信封吧,写信的人要知道这四个步骤,而且还要知道这四个步骤的顺序,恐怖吧,我们先看看这个过程如何表现出来的:
先看写信的过程接口,定义了写信的四个步骤:

  1. package com.cbf4life.facade;
  2.  
  3. /**
  4. * @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you all. 定义一个写信的过程
  5. */
  6. public interface LetterProcess {
  7. // 首先要写信的内容
  8. public void writeContext(String context);
  9.  
  10. // 其次写信封
  11. public void fillEnvelope(String address);
  12.  
  13. // 把信放到信封里
  14. public void letterInotoEnvelope();
  15.  
  16. // 然后邮递
  17. public void sendLetter();
  18. }

写信过程的具体实现:

  1. package com.cbf4life.facade;
  2.  
  3. /**
  4. * @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you all. 写信的具体实现了
  5. */
  6. public class LetterProcessImpl implements LetterProcess {
  7. // 写信
  8. public void writeContext(String context) {
  9. System.out.println("填写信的内容...." + context);
  10. }
  11.  
  12. // 在信封上填写必要的信息
  13. public void fillEnvelope(String address) {
  14. System.out.println("填写收件人地址及姓名...." + address);
  15. }
  16.  
  17. // 把信放到信封中,并封好
  18. public void letterInotoEnvelope() {
  19. System.out.println("把信放到信封中....");
  20. }
  21.  
  22. // 塞到邮箱中,邮递
  23. public void sendLetter() {
  24. System.out.println("邮递信件...");
  25. }
  26.  
  27. }

然后就有人开始用这个过程写信了:

  1. package com.cbf4life.facade;
  2.  
  3. /**
  4. * @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you all. 我开始给朋友写信了
  5. */
  6. public class Client {
  7. public static void main(String[] args) {
  8. // 创建一个处理信件的过程
  9. LetterProcess letterProcess = new LetterProcessImpl();
  10. // 开始写信
  11. letterProcess.writeContext("Hello,It's me,do you know who I am? I'm your old lover. I'd like to....");
  12. // 开始写信封
  13. letterProcess.fillEnvelope("Happy Road No. 666,God Province,Heaven");
  14. // 把信放到信封里,并封装好
  15. letterProcess.letterInotoEnvelope();
  16. // 跑到邮局把信塞到邮箱,投递
  17. letterProcess.sendLetter();
  18. }
  19. }

那这个过程与高内聚的要求相差甚远,你想,你要知道这四个步骤,而且还要知道这四个步骤的顺序,一旦出错,信就不可能邮寄出去,那我们如何来改进呢?先看类图:

这就是门面模式,还是比较简单的,Sub System 比较复杂,为了让调用者更方便的调用,就对Sub System进行了封装,增加了一个门面,Client 调用时,直接调用门面的方法就可以了,不用了解具体的实现方法以及相关的业务顺序,我们来看程序的改变,LetterProcess 接口和实现类都没有改变,只是增加了一个ModenPostOffice 类,我们这个java 程序清单如下:

  1. package com.cbf4life.facade;
  2.  
  3. /**
  4. * @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you all.
  5. */
  6. public class ModenPostOffice {
  7. private LetterProcess letterProcess = new LetterProcessImpl();
  8.  
  9. // 写信,封装,投递,一体化了
  10. public void sendLetter(String context, String address) {
  11. // 帮你写信
  12. letterProcess.writeContext(context);
  13. // 写好信封
  14. letterProcess.fillEnvelope(address);
  15. // 把信放到信封中
  16. letterProcess.letterInotoEnvelope();
  17. // 邮递信件
  18. letterProcess.sendLetter();
  19. }
  20. }

这个类是什么意思呢,就是说现在又一个叫Hell Road PostOffice(地狱路邮局)提供了一种新型的服务,客户只要把信的内容以及收信地址给他们,他们就会把信写好,封好,并发送出去,这种服务提出时大受欢迎呀,这简单呀,客户减少了很多工作,那我们看看客户是怎么调用的,Client.java 的程序清单如下:

  1. package com.cbf4life.facade;
  2.  
  3. /**
  4. * @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you all. 我开始给朋友写信了
  5. */
  6. public class Client {
  7. public static void main(String[] args) {
  8. // 现代化的邮局,有这项服务,邮局名称叫Hell Road
  9. ModenPostOffice hellRoadPostOffice = new ModenPostOffice();
  10. // 你只要把信的内容和收信人地址给他,他会帮你完成一系列的工作;
  11. String address = "Happy Road No. 666,God Province,Heaven"; // 定义一个地址
  12. String context = "Hello,It's me,do you know who I am? I'm your old lover.I'd like to....";
  13. hellRoadPostOffice.sendLetter(context, address);
  14. }
  15. }

看到没,客户简单了很多,提供这种模式后,系统的扩展性也有了很大的提高,突然一个非常时期,寄往God Province(上帝省)的邮件都必须进行安全检查,那我们这个就很好处理了,看类图:

看这个红色的框,只增加了这一部分,其他部分在类图上都不需要改动,那我们来看源码:

  1. package com.cbf4life.facade;
  2.  
  3. /**
  4. * @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you all.
  5. */
  6. public class ModenPostOffice {
  7. private LetterProcess letterProcess = new LetterProcessImpl();
  8. private Police letterPolice = new Police();
  9.  
  10. // 写信,封装,投递,一体化了
  11. public void sendLetter(String context, String address) {
  12. // 帮你写信
  13. letterProcess.writeContext(context);
  14. // 写好信封
  15. letterProcess.fillEnvelope(address);
  16. // 警察要检查信件了
  17. letterPolice.checkLetter(letterProcess);
  18. // 把信放到信封中
  19. letterProcess.letterInotoEnvelope();
  20. // 邮递信件
  21. letterProcess.sendLetter();
  22. }
  23. }

只是增加了一个letterPolice 变量的声明以及一个方法的调用,那这个写信的过程就变成了这样:先写信,然后写信封,然后警察开始检查,然后才把信放到信封,然后发送出去,那这个变更对客户来说,是透明的,他根本就看不到有人在检查他的邮件,他也不用了解,反正现代化的邮件都帮他做了,这也是他乐意的地方。

门面模式讲解完毕,这是一个很好的封装方法,一个子系统比较复杂的实话,比如算法或者业务比较复杂,就可以封装出一个或多个门面出来,项目的结构简单,而且扩展性非常好。还有,在一个较大项目中的时候,为了避免人员带来的风险,也可以使用这个模式,技术水平比较差的成员,尽量安排独立的模块(Sub System),然后把他写的程序封装到一个门面里,尽量让其他项目成员不用看到这些烂人的代码,看也看不懂,我也遇到过一个“高人”写的代码,private 方法、构造函数、常量基本都不用,你要一个public 方法,好,一个类里就一个public 方法,所有代码都在里面,然后你就看吧,一大坨的程序,看着能把人逼疯,使用门面模式后,对门面进行单元测试,约束项目成员的代码质量,对项目整体质量的提升也是一个比较好的帮助。

JAVA设计模式——第 7 章 门面模式【Facade Pattern】(转)的更多相关文章

  1. php门面模式(facade pattern)

    书上不全的代码,我自己补全的. <?php /* The facade pattern is used when we want to simplify the complexities of ...

  2. JAVA设计模式——第 2 章 代理模式【Proxy Pattern】(转)

    什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被代理的人能干活呀. ...

  3. JAVA设计模式——第 1 章 策略模式【Strategy Pattern】(转)

    刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的. 先说这个场景 ...

  4. JAVA设计模式——第 8 章 适配器模式【Adapter Pattern】(转)

    好,请安静,后排聊天的同学别吵醒前排睡觉的同学了,大家要相互理解嘛.今天讲适配器模式,这个模式也很简单,你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用,虽然两个国家的的电 ...

  5. JAVA设计模式——第 3 章 单例模式【Singleton Pattern】(转)

    这个模式是很有意思,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一.独苗的意思,那什么是独一份呢?你的思维是独一份,除此之外还有什么不能山寨的呢?我们举个比较难复制的 ...

  6. 外观模式 门面模式 Facade 结构型 设计模式(十三)

    外观模式(FACADE) 又称为门面模式   意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口,这一接口使得这一子系统更加易于使用. 意图解析 随着项目的持续发展,系统 ...

  7. Java设计模式(11)外观模式(Facade模式)

    外观模式(Facade)的定义:为子系统中的一组接口提供一个一致的界面. Facade一个典型应用就是数据库JDBC的应用,如下例对数据库的操作: public class DBCompare { C ...

  8. 说说设计模式~门面模式(Facade)

    返回目录 门面模式(Facade)属于结构型模式的一种,它符合面向对象的封装原则,但又不符合开闭原则,呵呵,今天我们主要说它的优点,不谈缺点. 定义 门面模式,是指提供一个统一的接口去访问多个子系统的 ...

  9. Java设计模式(22)命令模式(Command模式)

    Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体 ...

随机推荐

  1. 【Devops】【docker】【CI/CD】关于jenkins构建成功后一步,执行的shell命令详解+jenkins容器运行宿主机shell命令的实现方法

    1.展示这段shell命令 +详解 #================================================================================= ...

  2. C语言之基本算法24—黄金切割法求方程近似根

    //黄金切割法! /* ================================================================ 题目:用黄金切割法求解3*x*x*x-2*x* ...

  3. T4:使用 T4 消除程序和配置文件中重复的字符串信息

    背景 我们经常在配置文件中配置各种:id.name,然后在程序中使用这些配置获取信息,这导致了字符串重复出现在系统的多个地方,非常不利于维护,本文介绍采用 T4 来消除这种重复. T4 消除重复 配置 ...

  4. Java List集合冒泡法排序的两种实现

    冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已 ...

  5. android之Android中的SQL查询语句LIKE绑定参数问题解决办法(sqlite数据库)

    由于考虑到数据库的安全性,不被轻易SQL注入,执行查询语句时,一般不使用直接拼接的语句,而是使用参数传递的方法.然后在使用参数传递的方法中时,发现当使用like方式查询数据时,很容易出现一个问题. 错 ...

  6. JQuery中的对象和事件

    一:JQuery 对象和 Dom 对象 在使用 JQuery 过程中,我们一般(也是绝大多数情况下,除非我们使用了第二个框架)只有两类对象,即:JQuery 对象和 Dom 对象.Dom 对象指的是普 ...

  7. 检测Sql Server服务器SQL语句执行情况

    1.查找目前SQL Server所执行的SQL语法,并展示资源情况: SQL code ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...

  8. verilog语法实例学习(2)

    Verilog中的信号类型 线网类型 线网类型表示一个或多个门或者其它类型的信号源驱动的硬件连线.如果没有驱动源,则线网的默认值为z.verilog中定义的线网类型有以下几种:     wire,tr ...

  9. matlib常用知识

    把文件装入矩阵 x = load('ex4x.dat'); y = load('ex4y.dat'); [m, n] = size(x); %得到矩阵x的行数和列数 ex4x.dat共80行,2列,通 ...

  10. AndroidManifest.xml文件解析(转帖)

    原帖地址:http://www.cnblogs.com/pilang/archive/2011/04/20/2022932.html 一.关于AndroidManifest.xml       And ...