2021-07-26观察者模式与建造者模式
观察者模式
定义
观察者模式(Observer Pattern),又叫发布-订阅模式,定义一种一对多的依赖关系,一个主题对象可被多个观察者对象同时监听,使得主题对象状态变化时,所有依赖于它的对象都会得到通知并自动更新,实现了观察者和被观察者之间的解耦,如消息订阅,属于行为型模式。
通用写法
观察者模式主要包含4种角色:
-
被观察的对象(Observable):该角色是一个抽象类或接口,定义了增加、删除、通知观察者对象的方法;
-
具体被观察者:当前状态变化时,会通知已注册的观察者;
-
抽象观察者(Observer):定义了响应通知的更新方法;
-
具体观察者(ConcreteObserver):状态更新时,会自动做出响应。
//TODO 代码编写
适用场景
观察者使用场景.png代码中涉及到回调的一般是观察者模式,如Spring中的责任链
观察者和被观察者通常通过反射来进行解耦
源码中一般通过Listenter关键词判断是否为观察者模式
观察者可以给被观察者以响应(回调)
源码
Guava
观察者模式优缺点
观察者模式优点.png 观察者模式缺点.png问题
-
用Guava API实现GPer社区提问通知的业务场景。
- 访问者模式精髓是什么? 访问者模式精髓.png
建造者模式
定义:
建造者模式(Builder Pattern)是将一个复杂对象的构建与它的表示分离,使用同样的构建过程可以创建不同的表示。
特征:用户只需指定需要建造的类型就可以获得对象,建造过程及细节无需了解,属于创建型模式。
建造者模式适用于创建对象需要很多步骤,但是步骤的顺序不一定固定。
应用场景
-
适用于创建对象需要很多步骤,但是步骤的顺序不一定固定,如:责任链。
-
如果一个对象有非常复杂的内部结构(很多属性)
-
把复杂对象的创建和使用分离。
通用写法
建造者模式主要包含4个角色:
-
产品(Product):创建的产品类对象;
-
建造者抽象(Builder):建造者的抽象类,规范产品对象的各个组成部分的建造,一般由子类实现具体的建造过程。
-
建造者(ConcreteBuilder):具体的Builder类,根据不同的业务逻辑,具体化对象的各个组成部分的创建。
-
调用者(Director):调用具体的建造者,来创建对象的各个部分,在指导中不涉及具体产品信息,只负责保证对象各个部分完整创建或按某种顺序创建。
源码
StringBuilder、chain(责任链)、SqlSessionFactory、ServerSocketChannel、
Sql语句拼接.png建造者模式优缺点
优点:
-
封装性好,创建和使用分离;
-
扩展性好,建造类之间独立,一定程度上解耦。
缺点:
-
产生多余的Builder对象
-
产品内部发生变化,建造者都要修改,成本较大
问题
- 请列举1-3个需要用到建造者模式的业务场景。