策略模式题

来源:互联网 发布:mac中的照片在哪里 编辑:程序博客网 时间:2024/05/22 14:01

题目要求:

/**

 * 有这样一个类
 * public class Person
 * {
 *     private int age;
 *  private String name;
 *  private int id;
 * }
 *
    // getter and setter
     * 要求:假如有若干个类Person 对象存在一个List 当中,对他们进行排序,
     * 分别按照名字 年龄、id 进行排序 (要有正序与倒序两种排序方式)。假如年龄
     * 或者姓名重复,按照id的正序进行排序。要求使用策略模式进行。

 */

这是编写策略模式的步骤 以及策略模式的定义以及策略模式的角色

/**
 * 策略模式定义了一系列的算法,并将每一个算法封装起来,
 * 而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化
 * @author Administrator
 *
 *  —抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
    —具体策略角色:包装了相关的算法和行为。
    —环境角色:持有一个策略类的引用,最终给客户端调用。
 *
 *策略模式的编写步骤
–1.对策略对象定义一个公共接口。
–2.编写策略类,该类实现了上面的公共接口
–3.在使用策略对象的类中保存一个对策略对象的引用。
–4.在使用策略对象的类中,实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值
 */


第一步:按照要求 有一个Person类,里面有id age name等属性存放在List里面,所以都是Person类型的,要使用泛型。<Person>。

写出它们的get set方法。

 public class Person
{
    private int id;
    
    private String name;
    
    private int 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;
    }

}

第二步:定义一个公共的接口Strategy,里面声明了一个sort的方法,使用了泛型。

public interface Strategy
{
    public void sort(List<Person> list);    
}


第三步:实现具体策略角色:包装了相关的算法和行为。就是要求里面的排序规则,分别按照名字 年龄、id 进行排序 (要有正序与倒序两种排序方式)。假如年龄
       或者姓名重复,按照id的正序进行排序。


package com.freedom.Test2;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class UpNameSort implements Strategy,Comparator<Person>
{
    @Override
    public void sort(List<Person> list)
    {
        Collections.sort(list,this);
    }
    
    public int compare(Person o1,Person o2)
    {
        int result = o1.getName().compareTo(o2.getName());
        
        //如果两个名字相同,则按照Id排序
        if(0 == result)
        {
            return o1.getId() - o2.getId();
        }
        return result;
    }
}

第四步:环境角色Enviromrnt:持有一个策略类的引用,最终给客户端调用。代码实现:


import java.util.List;

public class Environment
{
    private Strategy strategy;
    
    public Environment(Strategy strategy)
    {
        this.strategy = strategy;
    }
    
    public Environment()
    {
        
    }
    
    public void setStrategy(Strategy strategy)
    {
        //调用自己的sort方法
        this.strategy = strategy;
    }
    
    public void sort(List<Person> list)
    {
        this.strategy.sort(list);
    }
}

最后: 写一个客户端来测试一下:Client。

import java.util.ArrayList;
import java.util.List;

public class Client
{
    public static void main(String[] args)
    {
        List<Person> list = new ArrayList<Person>();
        
        Person p1 = new Person();
        p1.setAge(10);
        p1.setId(1);
        p1.setName("Riven");
        
        Person p2 = new Person();
        p2.setAge(20);
        p2.setId(2);
        p2.setName("Lee");
        
        Person p3 = new Person();
        p3.setAge(30);
        p3.setId(3);
        p3.setName("YaSuo");
        
        Person p4 = new Person();
        p4.setAge(25);
        p4.setId(4);
        p4.setName("ALi");
        
        Person p5 = new Person();
        p5.setAge(32);
        p5.setId(1);
        p5.setName("ALi");
        
        
        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);
        list.add(p5);
        
        Environment env = new Environment();
        UpNameSort up = new UpNameSort();
        
        env.setStrategy(up);
        env.sort(list);
        
        for(int i = 0; i < list.size();i++)
        {
            Person p = list.get(i);
            System.out.println("id: " + p.getId() + ", name: " + p.getName()+", age:" + p.getAge());
        }
    }
}







0 0
原创粉丝点击