设计模式——(一)策略模式

  1. 定义

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

  1. 设计原则

    1. 找出应用中可能需要变化之处,把它们独立出来,不要和哪些不需要变化的代码混在一起。

      说明:Duck原来的中fly(),quack()方法随着duck种类不同,可能会不同,如果变一个种类的duck就继承并覆盖实现自己的fly()方法,让所有需要quack()和fly()方法的鸭子都去重复实现这两个方法的功能,那么就这么几个鸭子还好说,但是如果我们有几十、上百个鸭子的时候怎么办?如果某个方法要做一点修改,难道要重复修改上百遍吗?

    2. 面向接口编程,而不要面向实现编程.
    3. 多用组合,少用继承

      接口可以是抽象类和实际接口。

      接口Duck把接口FlyBehaviorQuackBehavior组合在一起。

    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()方法。

  1. 将变化的部分,采用接口封装

    如FilenameFilter的accept()方法,和FlyBehavior的fly()方法…

public interface FilenameFilter {

    boolean accept(File dir, String name);

}

 

public interface FlyBehavior {

    public void fly();

}

原文地址:https://www.cnblogs.com/thehappyyouth/p/3679705.html