设计模式的理解
设计模式的本职是是软件工程在维护性、扩展性、变化性、复杂度都很低,面向对象是基础,设计模式是在具体的方法、工具。
一、策略模式
定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换
何时使用
一个系统有许多类,而区分它们的只是他们直接的行为时
优点
算法可以自由切换
避免使用多重条件判断(如果不用策略模式我们可能会使用多重条件语句,不利于维护)
扩展性良好,增加一个策略只需实现接口即可
缺点
策略类数量会增多,每个策略都是一个类,复用的可能性很小
所有的策略类都需要对外暴露
使用场景
多个类只有算法或行为上稍有不同的场景
算法需要自由切换的场景
需要屏蔽算法规则的场景
应用实例
出行方式,自行车、汽车等,每一种出行方式都是一个策略
商场促销方式,打折、满减等
Java AWT中的LayoutManager,即布局管理器
注意事项
如果一个系统的策略多于四个,就需要考虑使用混合模式来解决策略类膨胀的问题
总结:分析项目种变化和不变化的部分,把变化的部分做成变化行为组,变化可以替换,
多用接口比继承更简单,复用性非常好
二、观察者模式Observer
观察者对应一对多的依赖关系设计。观察者一般可以看做是第三者,比如在学校上自习的时候,大家肯定都有过交头接耳、各种玩耍的经历,这时总会有一个“放风”的小伙伴,当老师即将出现时及时“通知”大家老师来了。再比如,拍卖会的时候,大家相互叫价,拍卖师会观察最高标价,然后通知给其它竞价者竞价,这就是一个观察者模式。
优点
观察者和被观察者是抽象耦合的;建立了一套触发机制
缺点
如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间
如果观察者和观察目标间有循环依赖,可能导致系统崩溃
没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的
使用场景
关联行为或者事件多级触发场景
跨系统的消息变换场景,如消息队列的处理机制
注意事项
避免循环引用
如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式
三、装饰者模式
动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
例如:打包快递:
- 主体:陶瓷、衣服、电器
- 包装:袋子、箱子、防撞袋、塑料泡沫、纸填充