码迷,mamicode.com
首页 > 其他好文 > 详细

Strategy策略模式

时间:2014-12-25 20:03:41      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:

策略模式(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策略模式

标签:

原文地址:http://www.cnblogs.com/kevin-yuan/p/4185303.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!