初学--策略模式习题练习整理

策略模式的组成:

   1.抽象策略角色:策略类,通常由一个接口或者抽象类实现;

   2.具体策略角色:包装了相关的算法和行为;

   3.环境角色:持有一个策略类的引用,最终给客户端调用的。

下面是在某个地方看到的习题,就拿来练手了。

首先可以看到有个给定的Person类,我们写下来先,并且添加类中属性的get,set方法和构造方法:

public class Person
{
    private String name;
    private int id;
    private int age;
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public int getId()
    {
        return id;
    }
    public void setId(int id)
    {
        this.id = id;
    }
    public int getAge()
    {
        return age;
    }
    public void setAge(int age)
    {
        this.age = age;
    }

    public Person(String name,int age,int id)
    {
        this.name = name;
        this.age = age;
        this.id = id;
    }
}

接下来需要定义一个接口(抽象策略角色),接口中再声明一个方法,这个方法即是用来排序的:

public interface Strategy
{
    /**
     * @param list  需要排序的list
     * @return  返回排序完成后的list
     */
    public ArrayList<Person> sort(ArrayList<Person> list);
}

接着便是实现这个接口了,在这里实现这个接口的时候就该指定排序的字段了,这里我就先用name来作为排序的字段,因此我们新建一个类(具体策略角色)并继承Strategy这个接口:

public class SortbyName implements Strategy
{

    @Override
    public ArrayList<Person> sort(ArrayList<Person> list)
    {
        list.sort(new NameComparator());
        return list;
    }
}

上面这段代码中重写了接口的方法,在方法中对list调用sort方法进行指定地排序,说指定排序是因为给它传了一个比较器【new NameComparator()】,

下面就来看看这个比较器的实现:

public class NameComparator implements Comparator
{

    @Override
    public int compare(Object o1, Object o2)
    {
        /*
         * o1和o2对应的即是两个传进来的Person,不能直接拿来比较
         * 此时要比较的是name属性,因此取出属性值再进行比较
         */
        Person person1 = (Person) o1;
        Person person2 = (Person) o2;
        String str1 = person1.getName();
        String str2 = person2.getName();
        //若姓名相同,则通过id升序排序
        if(str1.compareTo(str2) == 0)
        {
            return person1.getId() - person2.getId();
        }
        return str1.compareTo(str2);
    }

}

    抽象策略角色具体策略角色都已经完成,接下来就是实现环境角色:

public class Environment
{
    private Strategy strategy;

    private ArrayList<Person> list;

    public Strategy getStrategy()
    {
        return strategy;
    }

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

    public ArrayList<Person> getList()
    {
        return list;
    }

    public void setList(ArrayList<Person> list)
    {
        this.list = list;
    }

    public Environment(Strategy strategy,ArrayList<Person> list)
    {
        this.strategy = strategy;
        this.list = list;
    }

    public ArrayList<Person> sortbyName()
    {
        return strategy.sort(list);
    }
}

通过构造方法将要实现的strategy,list数据传入环境角色的类中,类中的sortbyName方法将会根据传进来的strategy对list进行处理并返回排序完的list。

最后就是编写客户端来调用环境角色了:

public class Client
{
    public static void main(String[] args)
    {
        ArrayList<Person> list = new ArrayList<Person>();
        list.add(new Person("zhangsan", 18, 5866));
        list.add(new Person("zhangsan", 25, 5863));
        list.add(new Person("lisi", 19, 5867));
        list.add(new Person("wangwu", 26, 5868));
        list.add(new Person("wangwu", 29, 5833));

        SortbyName sbn = new SortbyName();
        Environment environment = new Environment(sbn, list);
        list = environment.sortbyName();

        System.out.println("按姓名排序:");
        for (int i = 0; i < list.size(); i++)
        {
            Person person = list.get(i);
            System.out.println("姓名:" + person.getName() + "   年龄:"
                    + person.getAge() + "  学号:" + person.getId());
        }
    }
}

下面是打印结果:

题目的其他要求都差不多,依葫芦画瓢就可以写出来了。

时间: 2024-10-07 05:26:21

初学--策略模式习题练习整理的相关文章

设计模式整理_策略模式

△策略模式用于在用户行为经常发生变化的情况下,将行为单独提取出来,定义算法族,采用组合的方式,分别封装起来,让他们可以互相替换,此模式,让算法的变化独立于使用算法的客户. 该模式体现了如下设计模式的原则: 封装变化. 多用组合,少用继承. 针对接口编程,而不针对实现编程. 在策略模式中,第一点体现了对于类中变化的部分,进行了封装,第二部分体现了将算法族的接口定义在类中,采用组合的形式来完成对于类行为的定义,第三部分体现了利用借口代表每个行为,而将接口的具体实现交给其实现类来完成.下面是代码示例,

设计模式之策略模式

一.概述我们来实现一个企业的工资系统,该企业中不同级别的员工工资算法都不相同,针对该问题,最容易想到的莫过于在代码中堆积一大堆if…else…语句或者是switch…case…语句.如果该企业中不同级别的员工过多,或是对级别的调整比较频繁,那该系统就会显得复杂而脆弱.如何能将对象和算法解耦,从而使得在系统运行时能透明的改变对象的算法呢?这就到了策略模式大显身手的时候了.二.策略模式策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可相互替换.该模式可使得算法能独立于使用它的客户而变化.策

高效的策略模式设计方法

在实现策略模式的时候,我们习惯用switch-case来代替if-else if-else,在代码结构上会更加清晰,但这也只是从代码结构这个层面上来考虑,我们可以从代码速度上来考虑设计问题. 无论是switch-case还是if-else if-else的设计,都会遇到一个问题:如果判断的条件很多,假设是n个,而满足的条件恰好是最后一个,那么代码的执行效率就是o(n). 为了找到一个能够执行的代码,我们实际上是判断了n次,当然,这个判断其实是很快的,一般情况下的效率折损是不用考虑的,就算判断条件

机房合作——职责链+策略模式

</pre><p><span style="font-size: 24px;">这两个模式在进行个人重构的时候也使用了,当时是懵懵懂懂的,现在合作中又使用了一遍,思路清晰了很多,感觉这些设计模式之间有千丝万缕的联系,功夫还不到家还得慢慢的理一理,记得有个师哥说过"到最后会发现设计模式其实就一个",所以努力吧!先看看这两个模式的应用.</span></p><p><span style=&qu

一道题采用两种设计模式:对比策略模式和模版方法

摘要 <C++ Primer>习题14.38和14.39分别采用策略模式.模版方法解决问题. 问题 <C++ Primer 5th>习题 14.38 : 编写一个类令其检查某个给定的 string 对象的长度是否与一个阀值相等.使用该对象编写程序,统计并报告输入的文件中长度为 1 的单词有多少个.长度为 2 的单词有多少个........长度为 10 的单词有多少个. <C++ Primer 5th>习题 14.39 : 修改上一题的程序令其报告长度在 1 至 9 之间

JavaScript设计模式之策略模式(学习笔记)

在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选择学习策略模式. 策略模式:定义了一系列家族算法,并对每一种算法单独封装起来,让算法之间可以相互替换,独立于使用算法的客户. 通常我并不会记得“牛顿第一定律”的具体内容,所以我也难保证我会对这个定义记得多久……用FE经常见到的东西来举个例子说明一下: $("div").animation(

设计模式笔记——策略模式VS简单工厂模式

策略模式VS简单工厂模式   策略模式(Strategy)它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. 1.组成 -抽象策略角色: 策略类,通常由一个接口或者抽象类实现. -具体策略角色:包装了相关的算法和行为. -环境角色:持有一个策略类的引用,最终给客户端调用. 2.应用场景 - 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为. -需要在不同情况下使用不同的策略(算法),或者策略还可能在未来

实例说明策略模式

最近工作不是很多,正好抽出时间学习一下期待已经的设计模式,作为一名刚毕业一年的开发人员更应该多抽出些时间了解一下设计模式. 此片文章对策略模式做一个总结,希望对大家有帮助. (题外话:策略模式之前只是看定义和一些简单的例子,根本不明白,最后一头雾水,不过下面这个小例子还挺有趣的哦,能很好的理解到底什么是策略模式.) 一.案例 设计一个动作冒险类游戏,游戏大概是这样的:游戏中有不同的角色,每个角色战斗时使用的武器不同.现有两个角色:骑士(Knight)和巨魔头(Troll),Knight的武器是宝

[design-patterns]设计模式之一策略模式

设计模式 从今天开始开启设计模式专栏,我会系统的分析和总结每一个设计模式以及应用场景.那么首先,什么是设计模式呢,作为一个软件开发人员,程序人人都会写,但是写出一款逻辑清晰,扩展性强,可维护的程序就不是那么容易做到了.现实世界的问题复杂多样,如何将显示问题映射到我们编写的程序中本就是困难重重.另一方面,软件开发中一个不变的真理就是"一切都在变化之中",这种变化可能来自于程序本身的复杂度,也可能来自于客户不断变化的需求,这就要求我们在编写程序中一定要考虑变化的因素,将变化的因素抽离出来,