astron设计模式学习手记之门面模式

来源:互联网 发布:淘宝举报中心网址 编辑:程序博客网 时间:2024/06/06 03:38

门面模式

图解设计模式第15章

facade

facade建筑物的正面
别名:外观模式

如下图,像在线客服对用户而言就是一个门面。它封装了很多业务逻辑。比如客户咨询商品价格问题,客服需要咨询的是销售人员。客户反馈没有收到商品,客服需要联系配送。客服反映商品没开发票,客服需要联系仓储开票人员。遇到领券失败需要咨询市场部,遇到返修退换货需要联系售后部门甚至厂家。有了这个门面,客户不需要直接与内部系统打交道,直接联系客服就好了。
假如说,客服让用户直接联系公司的财务人员,或者厂家,那用户体验就会差到极点。现实当中就有这种例子。
Paste_Image.png

Paste_Image.png
Paste_Image.png

Paste_Image.png
后续:1代理模式和门面模式的区别
思考:按照上面的逻辑,门面模式跟策略模式是不是可以很好结合呢?因为门面模式后面需要不同的策略来执行?比如我们拨打10000号,针对这个门面,我们按照语音提示选择了1-9不同的按键,相当于new 出来了策略,然后走不同的流程就行了。
符合高内聚
可以这么说,凡是用户体验好的,操作简单的都是外观模式:
http://blog.csdn.net/zhangmeihong2/article/details/43097715
背景:股票1、2、3、国债1、房地产1等这些都具有相同的方法:买入、卖出。于是,抽象出一个基金类,基金由以上类聚合而成,那么客户端只需认识基金即可,不需理解其内部,即股票、国债和房地产等。这样一来,就解决了对股票、国债、房地产不熟悉的人的买股问题,他们只需买基金即可,不需要具体知道买的是什么。
特点:一组类似的类(股票一、二、三、国债、房地产)——聚合——一个类(基金)。客户端识别这一个类(基金),即可方便使用这一组类(股票一、二、三、国债、房地产)。
用到的原则:依赖倒转原则和迪米特法则。
优点:1、迪米特法则使得客户端简单;2、便于扩展。
缺点:多定义了一个类。
感受:之所以叫外观模式,可能是因为此模式,不需你具体了解股票、国债、房地产等,只需你知道基金这个表层即可。
导诊员也是门面
参考:linux内核中的门面
http://blog.csdn.net/dog250/article/details/5303231
参考:action和dao
http://blog.csdn.net/zuoxiaolong8810/article/details/9151203

千万要注意:

Paste_Image.png
Paste_Image.png

Paste_Image.png

上代码:
子系统1,这里没有用接口

public class SubSystem1 {    public void method1(){        System.out.println("method1");    }}

子系统2

public class SubSystem2 {    public void method2(){        System.out.println("method2");    }}

子系统3

public class SubSystem3 {    public void method3(){        System.out.println("method3");    }}

用来模拟系统1和3组合起来的流程

public class ComplexSystem13 {    private SubSystem1 subSystem1 = new SubSystem1();    private SubSystem3 subSystem3 = new SubSystem3();    public void method13(){        subSystem1.method1();        subSystem3.method3();        System.out.println("在新定义的类中完成了1和3两个流程,流程结束");    }}

最重要的门面

public class Facade {    private SubSystem1 subSystem1 = new SubSystem1();    private SubSystem2 subSystem2 = new SubSystem2();    private SubSystem3 subSystem3 = new SubSystem3();    private ComplexSystem13 ComplexSystem13 = new ComplexSystem13();    //这里最好把new放在对象构造方法中    public void doSomething1(){        subSystem1.method1();    }    public void doSomething2(){        subSystem2.method2();    }    public void doSomething3(){        subSystem3.method3();    }    public void doSomethingComplex(){        ComplexSystem13.method13();    }}

客户端,直接与门面打交道。没有调用子类的业务。

public class Client {    public static void main(String[] args) {        Facade fc =new Facade();        System.out.println("//测试单类方法");        fc.doSomething1();        System.out.println("=========================");        System.out.println("//测试复合方法");        fc.doSomethingComplex();    }}

大工告成
下一篇:调停者模式

原创粉丝点击