Java设计模式--门面模式

门面模式
该模式以写信送信为例。最初的类图如下:
这里写图片描述

刚开始的情况是要依次序的执行LetterProcess这四个步骤,那么如果有一个步骤不能完成,那么就不算完成这个过程,最后的代码如下:完全体现不出高内聚的设计要求。

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进行了封装,增加了一个门面,Client 调用时,直接调用门面的方法就可以了,不用了解具体的实现方法以及相关的业务顺序,我们来看程序的改变,LetterProcess 接口和实现类都没有改变,只是增加了一个ModenPostOffice 类。

ModenPostOffice 类类可以定义如下:

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();
    }
}

在Client中调用时,只需这样子:

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(上帝省)的邮件突然都必须进行安全检查。
那我们可以利用其扩展性来进行实现,类图如下:

这里写图片描述

代码修改如下:增加了一个 letterPolice 变量的声明以及一个方法的调用,就这样多实现一个业务需求了。

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();
    }
}

总结:
优点
(1)门面模式是一个很好的封装方法,一个子系统比较复杂的话,比如算法或者业务比较复杂,就可以封装出一个或多个门面出来,项目的结构简单,而且扩展性非常好。
(2)使用门面模式后,对门面进行单元测试,约束项目成员的代码质量,对项目整体质量的提升也是一个比较好的帮助。

缺点
不符合开闭原则。所谓的开闭原则是软件工程里面一个最基本的原则:对扩展开放,对修改关闭。换句话说,你的系统可以提供新的功能模块而不必进行修改。如果要改东西很麻烦,继承重写都不合适。

使用场景:
1. 为复杂的模块或子系统提供供外界访问的模块
2. 子系统相对独立
3. 预防低水平人员带来的风险

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值