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

本文介绍了门面模式的概念及其应用场景,通过在线客服系统示例说明了如何简化客户端与多个子系统的交互,增强了用户体验,并探讨了门面模式与其他设计模式的结合方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

门面模式

图解设计模式第15章

facade

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

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

Paste_Image.png
Paste_Image.png

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

    }
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值