策略模式(strategy)对存有person对象的list用升序、降序策略进行排序

从圣思园的教学资料里面看到的,嘿嘿!卖窝窝头,一块钱四个!

策略模式在编程中使用接口,而不是对接口的实现

要求:假设有若干个类Person对象存在一个List中,对他们进行排序,按照年龄排序(正序和倒序两种策略)。假如年龄重复,按照id的正序进行排序。使用策略模式。

1、person类

class Person
{
    private int id;
    private String name;
    private int age;
    private static int num = 1;
    public Person(String name,int age)
    {
        this.id = num++;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    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;
    }

    @Override
    public String toString() {
        return "Person{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}';
    }
}

 

2、定义一个排序接口,在定义一个正序的策略类和一个倒序的策略类实现这个排序接口,排序直接用Collections集合工具类里面的sort带比较器的方法,重写compare方法的时候判断一下age是否想等,相等则按照id的正序排序。

interface Strategy
{
    void sort(List list);
}
class SortByAgeAsc implements Strategy
{
    @Override
    public void sort(List list) {
        Collections.sort(list, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                int n = o1.getAge() - o2.getAge();
                if (n == 0)
                {
                    return o1.getId() - o2.getId();
                }
                return n;
            }
        });
    }
}
class SortByAgeDesc implements Strategy
{
    @Override
    public void sort(List list) {
        Collections.sort(list, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                int n = o2.getAge() - o1.getAge();
                if( n == 0) return o1.getId() - o2.getId();
                return n;
            }
        });
    }
}

3、环境类(到时候直接用strategy接口,我们知道有正序和倒序这两个策略,把strategy设置成这两个策略就可以了)

class Environment
{
    private Strategy strategy;
    public Environment(){}
    public Environment(Strategy strategy){
        this.strategy = strategy;
    }

    public Strategy getStrategy() {
        return strategy;
    }

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public void sort(List<Person> list)
    {
        strategy.sort(list);
    }
}

4、测试一下,奥利给

public class StrategyApp {
    public static void main(String[] args)
    {
        List<Person> list = new ArrayList<>();
        list.add(new Person("lhh",21));
        list.add(new Person("zq",20));
        list.add(new Person("lyx",20));
        list.add(new Person("xht",22));

        Environment env = new Environment();
        SortByAgeAsc ageAsc = new SortByAgeAsc();
        env.setStrategy(ageAsc);
        env.sort(list);
        System.out.println(list);

        Environment env2 = new Environment(new SortByAgeDesc());
        env2.sort(list);
        System.out.println(list);
    }
}

策略模式的组成

1、抽象策略角色:策略类(也就是上面的strategy接口),通常由一个接口或者抽象类实现

2、具体的策略角色:包装了相关的算法和行为。(如上文的SortByAgeAsc、SortByAgeDesc)

3、环境角色:持有一个策略类的引用,最终给客户端调用。(如上文的Environment)

策略模式的实现

1、策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换

2、策略模式使得算法可以在不影响到客户端的情况下发生变化。使用策略模式可以把行为和环境分割开来

3、环境类负责维持和查询行为类,各种算法则在具体策略中提供。由于算法和环境独立开来,算法的修改都不会影响环境和客户

策略模式的意义 

1、策略模式使开发人员能够开发出由许多可替换的部分组成的软件,并且各个部分之间是弱连接的关

2、弱连接的特性使软件具有更强的可扩展性,易于维护;更重要的是,它大大提高了软件的可重用性

策略模式的定义 

1、定义一组算法,将每个算法都封装起来,并且使它们之间可以互换

2、策略模式使这些算法在客户端调用它们的时候能够互不影响地变化

策略模式的缺点

1、客户端必须知道所有策略类,并自行决定使用哪一个策略类。

2、造成很多策略类

posted @ 2019-08-17 11:28  弘666  阅读(423)  评论(0编辑  收藏  举报