策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
说明: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(); } } |
编程思想第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(); } |
原文:http://www.cnblogs.com/thehappyyouth/p/3679705.html