转自: http://blog.csdn.net/houqd2012/article/details/12585093
一、策略模式的定义
—— 定义了一组算法,将每个算法包装起来,并且使它们之间可以互换
—— 策略模式使这些算法在客户端调用它们的时候能够相互不影响的变化,改变不同算法的实现方式不影响客户端的使用,即策略模式让算法独立于使用它的客户端而独立变化。
策略模式在Java中处处可以体现,TreeSet和TreeMap中均存在这样的构造方法: TreeSet(Comparator<? super E> comparator) 和 TreeMap(Comparator<? super K> comparator) ,对它的描述为:构造一个空的TreeSet,它根据 指定比较器 进行排序。这里的指定比较器就是我们根据需要自己写的“算法”,这就是策略模式最基本的使用方式。
策略模式体现了两个非常基本的面向对象设计的原则:
1. 封装变化的概念。
2. 编程中使用接口,而不是对接口的实现
二、策略模式的角色组成
抽象策略角色:
策略类,通常由一个接口或者抽象类实现
具体策略角色:包装了相关的算法和行为
环境角色:持有一个策略类的引用,最终给客户端调用的
四、编写策略模式的一般步骤:
1. 对策略对象定义一个公共接口
2. 编写具体策略类,该类实现了上面的接口
3. 在使用策略对象的类(即:环境角色)中保存一个对策略对象的引用
4. 在使用策略对象的类中,实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值
5. 客户端进行调用
五、Java实现代码
要求:有这样一个类Class Person,包含id、name、age属性,有若干了Person对象存储在List中,要求对他们进行排序,分别按照名字、年龄、id进行排序(要有正序与倒序两种方式)。如果年龄或者姓名重复,则按照id的正序进行排列。要求使用策略模式进行.
策略类
package java.util;
public interface Comparator<T> {
boolean equals(Object obj);
}
具体策略实现类
package model;
import java.util.Comparator;
public class SortById implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
return (int) (o1.getId()-o2.getId());
}
}
package model;
import java.util.Comparator;
public class SortByAge implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
return (int) -(o1.getAge()-o2.getAge());
}
}
环境角色(调用者)
package model;
public class Person {
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
private Long id;
private String name;
private int age;
public Long getId() {
return id;
}
public void setId(Long 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;
}
public Person(Long id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
}
package model;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class TestMain {
public static void main(String[] args) {
Comparator<Person> comparator;
Person p1=new Person(1L,"小一",12);
Person p2=new Person(2L,"小二",62);
Person p3=new Person(3L,"小三",52);
ArrayList<Person> persons=new ArrayList<Person>();
persons.add(p1);
persons.add(p2);
persons.add(p3);
Collections.sort(persons,new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return (int) (o1.getId()-o2.getId());
}
});
for (Person person : persons) {
System.out.println(person.toString());
}
comparator=new SortByAge();
Collections.sort(persons, comparator);
for (Person person : persons) {
System.out.println(person.toString());
}
}
}