-
定义
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
-
设计原则
-
找出应用中可能需要变化之处,把它们独立出来,不要和哪些不需要变化的代码混在一起。
说明:Duck原来的中fly(),quack()方法随着duck种类不同,可能会不同,如果变一个种类的duck就继承并覆盖实现自己的fly()方法,让所有需要quack()和fly()方法的鸭子都去重复实现这两个方法的功能,那么就这么几个鸭子还好说,但是如果我们有几十、上百个鸭子的时候怎么办?如果某个方法要做一点修改,难道要重复修改上百遍吗?
- 面向接口编程,而不要面向实现编程.
-
多用组合,少用继承
接口可以是抽象类和实际接口。
接口Duck把接口FlyBehavior和QuackBehavior组合在一起。
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {
}
public void performFly(){
flyBehavior.fly();//接口
}
public void performQuack(){
quackBehavior.quack();//接口
}
public void swim(){
System.out.println("all ducks float");
}
}
public class MallardDuck extends Duck {
public MallardDuck(){
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
public void display(){
System.out.println("MallardDuck");
}
}
-
public class MiniDuckSimulator { public static void main(String[] args){ Duck mallard = new MallardDuck();//接口 mallard.performQuack(); mallard.performFly(); } } |
3.应用File类的list()方法
编程思想第18章
public class DirList { public static void main(String[] args) { // TODO Auto-generated method stub File path = new File("."); String[] list; if(args.length == 0) list= path.list(); else list = path.list((FilenameFilter) new DirFilter(args[0])); for(String dirItem: list){ System.out.println(dirItem); } } } |
在高亮标记的部分,list()方法的输入参数是以接口(filenameFilter)形式,list()可以回调accept()方法。
-
将变化的部分,采用接口封装
如FilenameFilter的accept()方法,和FlyBehavior的fly()方法…
public interface FilenameFilter { boolean accept(File dir, String name); } |
public interface FlyBehavior { public void fly(); } |