设计模式-策略模式
程序员文章站
2022-03-16 14:18:57
...
微信公众号:Java修炼手册
关注可领取3T编程资料及面试题解。问题或建议,请公众号留言;
希望我的分享对你有所帮助
设计模式之策略模式
设计模式入门
1、设计模式是人们在面对同类型软件工程设计问题所总结出的一些有用经验。模式不是代码,而是某类问题的通用设计解决方案
2、4人组Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides总结写了《设计模式》
3、学习设计模式最好的方式:在自己的设计和以往的工程里寻找何处可以使用它们
4、设计模式的本质目的是使软件工程在维护性、扩展性、变化性、复杂度方面成O(N)
5、OO是原则,设计模式是具体方法、工具
先上例子代码
1、从项目"模拟鸭子游戏"开始
2、从OO的角度设计这个项目,鸭子超类,扩展超类:
给鸭子超类三个方法
1public abstract class Duck {
2 public void Quack() {
3 System.out.println("~~gaga~~");
4 }
5 public abstract void display();
6 public void swim() {
7 System.out.println("~~im swim~~");
8 }
9}
10
11然后绿头鸭继承Duck :
12public class GreenHeadDuck extends Duck {
13 @Override
14 public void display() {
15 System.out.println("**GreenHead**");
16 }
17}
同理,可以有红头,白头等各种鸭子
应对新的需求,看看这个设计的可扩展性
1)添加会飞的鸭子
1面向对象思维里的继承方式解决方案是:
2public abstract class Duck {
3 ...;
4 public void Fly() {
5 System.out.println("~~im fly~~");
6 }
7};
问题来了,这个Fly让所有子类都会飞了,这是不科学的。
继承的问题:对类的局部改动,尤其超类的局部改动,会影响其他部分。影响会有溢出效应
1继续尝试用OO原理来解决,覆盖:
2public class GreenHeadDuck extends Duck {
3...;
4public void Fly() {
5 System.out.println("~~no fly~~");
6 }
7}
8又有新需求,石头鸭子,填坑:
9public class StoneDuck extends Duck {
10.... };
11超类挖的一个坑,每个子类都要来填,增加工作量,复杂度O(N^2)。不是好的设计方式
使用策略模式解决问题
需要新的设计方式,应对项目的扩展性,降低复杂度:
1)分析项目变化与不变部分,提取变化部分,抽象成接口+实现;
2)鸭子哪些功能是会根据新需求变化的?叫声、飞行…
1接口:
2 1)public interface FlyBehavior
3 {
4 void fly();}
5
6 2)public interface QuackBehavior
7 {
8 void quack();};
好处:新增行为简单,行为类更好的复用,组合更方便。既有继承带来的复用好处,没有挖坑
1重新设计的鸭子项目:
2public abstract class Duck {
3 FlyBehavior mFlyBehavior;
4 QuackBehavior mQuackBehavior;
5 public Duck() { }
6 public void Fly() {
7 mFlyBehavior.fly();
8 }
9 public void Quack() {
10 mQuackBehavior.quack();
11 }
12 public abstract void display();
13 }
1绿头鸭、石头鸭:
2public class GreenHeadDuck extends Duck {
3 public GreenHeadDuck() {
4 mFlyBehavior = new GoodFlyBehavior();
5 mQuackBehavior = new GaGaQuackBehavior();
6 }
7 @Override
8 public void display() {...}
9}
策略模式解读
分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里具体设定行为对象。原则就是:分离变化部分,封装接口,基于接口编程各种功能。此模式让行为算法的变化独立于算法的使用者。
策略模式注意点
1、分析项目中变化部分与不变部分
2、多用组合少用继承;用行为类组合,而不是行为的继承。更有弹性
3、设计模式有没有相应的库直接使用?有些库或框架本身就用某种设计模式设计的