zoukankan      html  css  js  c++  java
  • 设计模式 之 策略模式

    策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的对象


     

    例:对一群人进行排序,可以按身高排序也可以按体重排序还可以按姓名排序等等

    第一版:实现功能满足需求

    对这几种比较算法进行抽象化

    public interface Comparator {
        int compare(Person p1, Person p2);
    }
    View Code

      按身高排序算法的实现

    public class PersonHeightComparator implements Comparator {
        @Override
        public int compare(Person p1, Person p2) {
            if(p1.getHeight() > p2.getHeight())
                return 1;
            else if(p1.getHeight() < p2.getHeight())
                return -1;
            else
                return 0;
        }
    }
    View Code

     按体重排序算法的实现

    public class PersonWeightComparator implements Comparator {
        @Override
        public int compare(Person p1, Person p2) {
            if(p1.getWeight() > p2.getWeight())
                return 1;
            else if(p1.getWeight() < p2.getWeight())
                return -1;
            else
                return 0;
        }
    }
    View Code

     Person类(支持设置不同的排序方法)

    public class Person {
        private String name;
        private int height;
        private int weight;
        
        private Comparator comparator;
        
        public Person(String name, int height, int weight, Comparator comparator) {
            this.name = name;
            this.height = height;
            this.weight = weight;
            this.comparator = comparator;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getHeight() {
            return height;
        }
    
        public void setHeight(int height) {
            this.height = height;
        }
    
        public int getWeight() {
            return weight;
        }
    
        public void setWeight(int weight) {
            this.weight = weight;
        }
        
        public int compareTo(Person p) {
            return comparator.compare(this, p);
        }
        
        @Override
        public String toString() {
            return name + ":" + height + "·" + weight;
        }
    }
    View Code

     测试

    public class Test {
        public static void main(String[] args) {
            Comparator comparator = new PersonHeightComparator(); // = new PersonWeightComparator();
            Person[] persons = new Person[] {
                    new Person("a", 175, 68, comparator),
                    new Person("b", 178, 67, comparator),
                    new Person("c", 173, 66, comparator)
            };
            sort(persons); // 利用排序算法对persons进行排序
            System.out.println(Arrays.toString(persons));
        }
        public static void sort(Person[] persons) {
            for(int i=0; i<persons.length; i++) {
                for(int j=0; j<persons.length-i-1; j++) {
                    Person p1 = persons[j];
                    Person p2 = persons[j+1];
                    if(p1.compareTo(p2) > 0) {
                        persons[j] = p2;
                        persons[j+1] = p1;
                    }
                }
            }
        }
    }
    View Code

     OK,需求已实现了。按身高、体重的排序算法能否也能应用的其它可以排序的事物上呢,答案是肯定。

    第二版:完成第一版遗留的问题

    1. 对可以排序的对象进行抽象
    2. 泛型化

    public interface Comparable<T> {
        public int compareTo(T o);
    }
    
    public interface Comparator<T> {
        int compare(T o1, T o2);
    }
    
    public class Person implements Comparable<Person> {
    
    public class PersonHeightComparator implements Comparator<Person> {
        // 与上面相同
    }
    
    public class PersonWeightComparator implements Comparator<Person> {
        // 与上面相同
    }
    View Code

     OK,这就是JDK中已经实现的Comparator策略。

    作者:踮起脚尖眺望
    出处:http://www.cnblogs.com/wangj1130
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    使用setTimeout()代替setInterval()
    音视频入门-02-RGB拼图
    音视频入门-01-认识RGB
    CMake入门-04-自定义编译选项
    CMake入门-03-还是HelloWorld
    CMake入门-02-HelloWorld扩展
    CMake入门-01-从HelloWorld开始
    HTML页面启动sass监听编译成css文件
    安装+配置Express
    安装+配置Nginx
  • 原文地址:https://www.cnblogs.com/wangj1130/p/4822885.html
Copyright © 2011-2022 走看看