文章目录
源码链接:https://github.com/ouyangxizhu/design_pattern.git
二、结构型模式
1. 外观模式(门面模式)
com.ouyangxizhu.design.pattern.structural.facade
定义
提供了一个结构来访问子系统中的一群接口。
这个外观结构封装了子系统之间的调用逻辑,调用顺序。比如购物,用户只关注我能不能买成功(下单功能),至于怎么减库存,怎么生成订单,怎么物流配送都不需要知道。
适用场景
- 当子系统越来越复杂,增加外观模式提供简单接口调用。
- 构件多层系统结构,利用外观对象作为每层的入口,简化层间调用。
优点
- 简化了调用过程,无需深入了解子系统,防止带来风险。
- 减少系统依赖,松散耦合。
- 更好的划分访问层次。
- 符合迪米特法则,即最少知道原则。(调用者只和外观类有关系)
缺点
- 增加或者扩展子系统容易引入风险。
- 增加或者扩展子系统不符合开闭原则。(可以使用抽象外观类,或者采用继承实现)
源码
都是对jdbc的封装。
org.springframework.jdbc.support.JdbcUtils#closeConnection(封装Connection的close()等)
org.springframework.jdbc.support.JdbcUtils#getResultSetValue(java.sql.ResultSet, int, java.lang.Class<?>)
org.apache.ibatis.session.Configuration#newParameterHandler等handler
tomcat的requestFacade类(实现HttpSevletRequest接口)StatementFacade等
外观模式和中介者模式
外观模式关注外界和外观类(封装子系统)之间的交互。
中介者模式关注子系统内部之间的交互。
外观模式和单例模式
可以把外观模式的外观对象做成单例使用。
外观模式和抽象工厂模式
外观对象可以通过抽象工厂获得子系统的实例。子系统可以对外观实例屏蔽细节。
2. 装饰者模式
com.ouyangxizhu.design.pattern.structural.decorator
定义
装饰者有一个有参构造器,该参数为被装饰者,只需要在调用被装饰者前或者后添加逻辑,就可以进行装饰。可以多层装饰。
在不改变原有对象的基础上,将功能附加到对象上。提供了比继承更有弹性的替代方案(扩展原有对象功能,装饰者是运行期间添加,并且可以自由组合顺序的装饰,继承是编译过程添加的。装饰者会继承被装饰的对象)一般装饰者会有自己父类的属性,可以在构造器的时候注入。
适用场景
- 添加一个类的功能,或者给一个类添加附加职责。
- 动态的给一个对象添加功能,这些功能可以再动态撤销。