策略模式
简介
封装好一个可以重复利用的算法族,以做到哪里需要哪里用。
避免有多个相同或相似的算法需要使用大量的 if else
实际应用
- JAVA AWT 中的 LayoutManager,可以使用多种布局方式,即为不同的策略
- 坦克大战中如果需要发射不同的炮弹,可以指定不同的策略进行替换
类图
代码
-
设计一个鸭子类,有许多种不同的鸭子实现,它们具有相同的行为叫。
public class Duck{ void quack(){ System.out.println("gagaga"); }; } // 子类A class DuckA extends Duck{ } // 子类B class DuckA extends Duck{ }
-
问题:如果两个子类的可能并不是
gagaga
的叫?-
解决:为每一个子类进行方法的重写
// 子类A class DuckA extends Duck{ } // 子类B class DuckA extends Duck{ void quack(){ System.out.println("jijiji"); } }
-
-
如果有许多鸭子子类,例如 DuckC,DuckD,DuckE … ,等进行
jijiji
或者其他的叫声该怎么办-
解决:定义接口用于实现鸭子的 quack 方法,同时定义一系列定义好的策略,用于实时执行鸭子的行为
interface Quackable{ void quack(); } public class Duck{ Quackable quackAble; void quack(){ quackAble.quack(); }; } // 子类A class DuckA extends Duck{ } // 子类B class DuckA extends Duck{ } // 策略1 class GUGUQuack implements Quackable{ void quack(){ System.out.println("gugugu"); } } // 策略2 class JiJiQuack implements Quackable{ void quack(){ System.out.println("jiji"); } } // 策略3 class DUDUQuack implements Quackable{ void quack(){ System.out.println("dudu"); } }
此时便可以根据不同的需要采用不同的策略,极大的增大了代码的利用率。
-
引用
- Head First 设计模式
- 菜鸟教程