设计模式之外观 (Facade) 模式

237 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情

简介

外观模式(Facade),亦称“过程模式”。学校课程评价模式之一。美国教育学者斯泰克1967 年在所著《教育评价的外观》中提出。主张按照描述和判断资料来评价课程,关键的活动是在课程实施的全过程中进行观察和搜集意见,以了解人们对课程的不同看法。这种模式不限于检查教学的成果,重视描述和判断教学过程中各种复杂、动态的现象和事物。

正章

优点:

(1)实现了子系统与客户端之间的松耦合关系。
(2)客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。

缺点:

(1) 不能很好地限制客户使用子系统类。
(2) 增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。

思考
想想看,你在 JavaAPI 中遇到过哪些外观,你还希望 Java 能够新增哪些外观? P262

  • println、log 日志接口、JDBC 接口
  • 突然让想感觉想不出来,各种 API 都用得挺顺的,没有太麻烦的使用 外观模式
    提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。 P264

image.png

特点

  • 提供简化的接口的同时,依然将系统完整的功能暴露出来 P260
  • 将客户从组件的子系统中解耦 P260
  • 意图是提供子系统的一个简化接口 P260 区别
  • 适配器模式:将一个对象包装起来以改变其接口
  • 装饰器模式:将一个对象包装起来以增加新的行为和责任
  • 外观模式:将一群对象“包装”起来以简化其接口 设计原则
    最少知识原则:只和你的密友谈话。即减少对象之间的交互,减少类的耦合。 P265

遵循最少知识原则的方针:
对于任何对象,在该对象的方法内,我们只应该调用属于以下范围的方法: P266

  • 该对象本身
  • 被当作方法的参数而传递进来的对象
  • 此方法所创建或实例化的任何对象
  • 对象的任何组件 由前三条可知:不要调用其他方法返回结果的方法

思考
这些类有没有违反最少知识原则?请说明原因。 P268

public class House {
    WeatherStation station;
    
    // 其他的方法和构造器
    
    public float getTemp() {
        return station.getThermometer().getTemperature();
    }
    // 违反了最少知识原则
    // 调用了方法返回结果的方法
}

public class Houst {
    WeatherStation station;

    // 其他的方法和构造器
    
    public float getTemp() {
        Thermometer thermometer = station.getThermometer();
        return getTempHelper(thermometer);
    }
    // 没有违反最少知识原则
    // 只调用了对象的组件以及对象本身的方法
    
    public float getTempHelper(Thermometer thermometer) {
        return thermometer.getTemperature();
    }
    // 只调用了参数
}

所思所想\

  • 大部分接口功能的封装应该都算使用了外观模式。比如说下单操作,对外只暴露了一个下单接口,但内部其实有大量的子组件调用(购物车接口、运费计算接口、优惠券接口、地址接口、下单中间件、物流接口等)。再比如一个简单println,内部就包含了并发控制、异常捕获、调用BufferedWriter对象进行输出控制等。