Java设计模式——门面(外观)模式(Facade Pattern)

来源:互联网 发布:小米电视网络经常卡 编辑:程序博客网 时间:2024/05/16 05:41

场景一

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

我们的类图还是从最原始的状态开始:

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

先看写信的过程接口,定义了写信的四个步骤:

package com.gumx.facade;/*** @author gumx* I'm glad to share my knowledge with you all.* 定义一个写信的过程*/public interface LetterProcess {    //首先要写信的内容    public void writeContext(String context);    //其次写信封    public void fillEnvelope(String address);    //把信放到信封里    public void letterInotoEnvelope();    //然后邮递    public void sendLetter();}
写信过程的具体实现:

package com.gumx.facade;/*** @author gumx* I'm glad to share my knowledge with you all.* 写信的具体实现了*/public class LetterProcessImpl implements LetterProcess {    //写信    public void writeContext(String context) {        System.out.println("填写信的内容...." + context);    }    //在信封上填写必要的信息    public void fillEnvelope(String address) {        System.out.println("填写收件人地址及姓名...." + address);    }    //把信放到信封中,并封好    public void letterInotoEnvelope() {       System.out.println("把信放到信封中....");    }    //塞到邮箱中,邮递    public void sendLetter() {       System.out.println("邮递信件...");    }}
然后就有人开始用这个过程写信了:

package com.gumx.facade;/*** @author gumx* I'm glad to share my knowledge with you all.* 我开始给朋友写信了*/public class Client {    public static void main(String[] args) {        //创建一个处理信件的过程        LetterProcess letterProcess = new LetterProcessImpl();        //开始写信        letterProcess.writeContext("Hello,It's me,do you know who I am? I'm your        old lover. I'd like to....");        //开始写信封        letterProcess.fillEnvelope("Happy Road No. 666,God Province,Heaven");        //把信放到信封里,并封装好        letterProcess.letterInotoEnvelope();        //跑到邮局把信塞到邮箱,投递        letterProcess.sendLetter();    }}
那这个过程与高内聚的要求相差甚远,你想,你要知道这四个步骤,而且还要知道这四个步骤的顺序,一旦出错,信就不可能邮寄出去,那我们如何来改进呢?先看类图:

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

package com.gumx.facade;/*** @author gumx* I'm glad to share my knowledge with you all.*/public class ModenPostOffice {    private LetterProcess letterProcess = new LetterProcessImpl();    //写信,封装,投递,一体化了    public void sendLetter(String context,String address){        //帮你写信        letterProcess.writeContext(context);        //写好信封        letterProcess.fillEnvelope(address);        //把信放到信封中        letterProcess.letterInotoEnvelope();        //邮递信件        letterProcess.sendLetter();    }}
这个类是什么意思呢,就是说现在又一个叫Hell Road PostOffice(地狱路邮局)提供了一种新型的服务,客户只要把信的内容以及收信地址给他们,他们就会把信写好,封好,并发送出去,这种服务提出时大受欢迎呀,这简单呀,客户减少了很多工作,那我们看看客户是怎么调用的,Client.java 的程序清单如下:

package com.gumx.facade;/*** @author gumx* I'm glad to share my knowledge with you all.* 我开始给朋友写信了*/public class Client {    public static void main(String[] args) {        //现代化的邮局,有这项服务,邮局名称叫Hell Road        ModenPostOffice hellRoadPostOffice = new ModenPostOffice();        //你只要把信的内容和收信人地址给他,他会帮你完成一系列的工作;        String address = "Happy Road No. 666,God Province,Heaven"; //定义一个地址        String context = "Hello,It's me,do you know who I am? I'm your old lover.I'd like to....";        hellRoadPostOffice.sendLetter(context, address);    }}
看到没,客户简单了很多,提供这种模式后,系统的扩展性也有了很大的提高,突然一个非常时期,寄往God Province(上帝省)的邮件都必须进行安全检查,那我们这个就很好处理了,看类图:

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

package com.gumx.facade;/*** @author gumx* I'm glad to share my knowledge with you all.*/public class ModenPostOffice {    private LetterProcess letterProcess = new LetterProcessImpl();    private Police letterPolice = new Police();    //写信,封装,投递,一体化了    public void sendLetter(String context,String address){       //帮你写信       letterProcess.writeContext(context);       //写好信封       letterProcess.fillEnvelope(address);       //警察要检查信件了       letterPolice.checkLetter(letterProcess);       //把信放到信封中       letterProcess.letterInotoEnvelope();       //邮递信件       letterProcess.sendLetter();    }}
        只是增加了一个letterPolice 变量的声明以及一个方法的调用,那这个写信的过程就变成了这样:先写信,然后写信封,然后警察开始检查,然后才把信放到信封,然后发送出去,那这个变更对客户来说,是透明的,他根本就看不到有人在检查他的邮件,他也不用了解,反正现代化的邮件都帮他做了,这也是他乐意的地方。
        门面模式讲解完毕,这是一个很好的封装方法,一个子系统比较复杂的实话,比如算法或者业务比较复杂,就可以封装出一个或多个门面出来,项目的结构简单,而且扩展性非常好。还有,在一个较大项目中的时候,为了避免人员带来的风险,也可以使用这个模式,技术水平比较差的成员,尽量安排独立的模块(Sub System),然后把他写的程序封装到一个门面里,尽量让其他项目成员不用看到这些烂人的代码,看也看不懂,我也遇到过一个“高人”写的代码,private 方法、构造函数、常量基本都不用,你要一个public 方法,好,一个类里就一个public 方法,所有代码都在里面,然后你就看吧,一大坨的程序,看着能把人逼疯,使用门面模式后,对门面进行单元测试,约束项目成员的代码质量,对项目整体质量的提升也是一个比较好的帮助。



1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 交警开的扣行驶证的单不见了怎么办 行驶证累计记分满12分后怎么办 行车证丢了被交警查到怎么办 手机摔了一下一半黑屏了怎么办 三星手机的显示屏插头坏了怎么办? 被普通的手机维修店骗了怎么办? 手机外屏裂了内屏进水了怎么办 小米2s手机忘了解锁图案怎么办 红米note5手机屏烂了怎么办 网上买好高铁票身份证没带怎么办 高铁票买好了身份证丢了怎么办 苏州园区社保卡丢了怎么办 大学办的社保卡丢了怎么办 毕业六年了大学社保卡丢了怎么办 医保卡丢了补办后卡里余额怎么办 银行卡丢了记不住卡号怎么办 哈尔滨医保卡挂失后又找到了怎么办 孩子在哈尔滨户口在外地医保怎么办 椒江二桥通行证被扣走了怎么办 住建委查到买房材料不真怎么办 房子租出去被别人又租出去了怎么办 在成都乘出租车房产证掉了怎么办 电信不限量卡限网速了怎么办 only实体店换货没有小票怎么办 运管所包车单不给盖章怎么办 上海留学生落户过了取号时间怎么办 电信固话怎么办才能显示自己公司 日本跟团签证没有资产证明怎么办 摇号手机号换了密码忘了怎么办 小客车摇号的账号密码忘了怎么办 去银行交违章罚款单子丢了怎么办 我的身份证被别人办了信用卡怎么办 北京驾驶证在深圳扣了分怎么办 c照一次被扣12分怎么办 教师资格证认定申请表填错了怎么办 外地车在北京违章没有牡丹卡怎么办 护士辞职了原单位不给延续怎么办 护士证注册的单位倒闭了怎么办 护士证注册的医院倒闭了怎么办 显示发货了但没物流信息怎么办 考科目三被别人举报了怎么办