首页 > 代码库 > Strategy策略模式

Strategy策略模式

策略模式(Strategy):

它定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)

 

动机:

在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。

如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?

策略模式就能使算法与对象本身解耦,能够在需要时透明的更改对象的算法。

通俗点讲,策略模式就是将对象本身的算法进行抽象,从而从对象本身中剥离出来。
比如对某一类对象obj进行比较,我们可能会采取多种比较策略,如果每一种比较策略都在对象obj中写一个实现方法,这个类将会膨胀。
在我们看来,所有的比较归根结底就是比较出两个对象的大小,所以我们可以对这一部分进行抽象,抽成一个comparator比较器,由外部调用处对这个比较器进行注入。这样我们就能灵活的控制到底使用哪一种比较规则了。

 

举例:

比较学生,1:按年龄比较   2:按身高比较

public interface Comparator<T> {    public int compare(T obj1, T obj2);}

 

public class Student {    private String name;    private int age;    private double height;    private Comparator<Student> comparator;        public Comparator<Student> getComparator() {        return comparator;    }    public void setComparator(Comparator<Student> comparator) {        this.comparator = comparator;    }    public double getHeight() {        return height;    }    public void setHeight(double height) {        this.height = height;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public int compare(Student s) {        return this.comparator.compare(this, s);    }}

 

public class StuAgeComparator implements Comparator<Student> {    @Override    public int compare(Student s1, Student s2) {        if(s1.getAge() > s2.getAge()){            return 1;        } else if (s1.getAge() == s2.getAge()){            return 0;        } else {            return -1;        }    }    }

 

public class StuHeightComparator implements Comparator<Student> {    @Override    public int compare(Student s1, Student s2) {        if(s1.getHeight() > s2.getHeight()){            return 1;        } else if (s1.getHeight() == s2.getHeight()){            return 0;        } else {            return -1;        }    }    }

 

客户端调用:

public class Client {    public static void main(String[] args) {        Student s1 = new Student();        s1.setName("张三");        s1.setAge(18);        s1.setHeight(1.7);        Student s2 = new Student();        s2.setName("李四");        s2.setAge(15);        s2.setHeight(1.80);                s1.setComparator(new StuAgeComparator());        System.out.println(s1.compare(s2));        s1.setComparator(new StuHeightComparator());        System.out.println(s1.compare(s2));    }}

 

 

其实我上面讲的就是JDK中的Comparator这个接口,但是好像还少了点什么,少的就是Comparable这个接口。

待续........

Strategy策略模式