策略模式
角色
- 抽象策略
策略的一个抽象,通常是一个函数式接口。 - 具体策略
实现抽象策略的类的实例,匿名内部类的对象较为常见。 - 策略使用者
该使用者实例应该持有一个抽象策略引用作为成员,以便调用策略中的方法。
UML
通常的用法是创建Environment类同时使用匿名内部类初始化strategy引用,然后调用Environment中的方法,这些方法中会调用Strategy的实现类实例的方法。策略模式所处可见,是一种十分常用的设计模式,解耦具体策略。
例子代码
- Environment类:
public class SortUtil {
private Sort sort;
public SortUtil(Sort sort) {
this.sort = sort;
}
public SortUtil() {
}
public Sort getSort() {
return sort;
}
public void setSort(Sort sort) {
this.sort = sort;
}
public void sort(List<Person> list){
sort.sort(list);
}
}
- Strategy接口
public interface Sort {
void sort(List<Person> list);
}
- Strategy类的一个实现类:
public class SortByNameASC implements Sort,Comparator<Person> {
public void sort(List<Person> list)
{
Collections.sort(list,this);
}
@Deprecated
public int compare(Person o1,Person o2){
int result = o1.getName().compareTo(o2.getName());
if(0 == result){
return o1.getId() - o2.getId();
}
return result;
}
}