策略模式的角色
- 抽象策略角色
- 具体策略角色
- 环境角色
在jdk中,Comparator就是一种典型的策略模式,其中,Comparator就是抽象的策略角色,自定义一个类并实现Comparator就叫做具体策略角色,使用自定义的类对TreeSet进行排序,那么这个TreeSet就是环境角色
例:有一个Person类,放在一个列表中,要分别按id升序和降序排列,要求使用策略模式
1、Person类
public class Person
{
private int id;
private String name;
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 Person(int id,String name)
{
this.id=id;
this.name=name;
}
public String toString()
{
return "id="+id+" name="+name;
}
}
2、定义抽象策略(Comparator 注意这是我定义的,并非jdk自带的那个Comparator)
public interface Comparator<T>
{
public List<T> sort(List<T> list);
}
3、定义具体策略(AscComparator,DescComparator 分别实现Comparator)
public class AscComparator implements Comparator<Person>
{
@Override
public List<Person> sort(List<Person> list)
{
Person[] persons=list.toArray(new Person[1]);
for(int i=0;i<persons.length-1;i++)
{
for(int j=0;j<persons.length-i-1;j++)
{
if(persons[j].getId()>persons[j+1].getId())
{
Person temp=persons[j];
persons[j]=persons[j+1];
persons[j+1]=temp;
}
}
}
list=Arrays.asList(persons);
return list;
}
}
public class DescComparator implements Comparator<Person>
{
@Override
public List<Person> sort(List<Person> list)
{
Person[] persons=list.toArray(new Person[1]);
for(int i=0;i<persons.length-1;i++)
{
for(int j=0;j<persons.length-i-1;j++)
{
if(persons[j].getId()<persons[j+1].getId())
{
Person temp=persons[j];
persons[j]=persons[j+1];
persons[j+1]=temp;
}
}
}
list=Arrays.asList(persons);
return list;
}
}
4、环境角色
public class Collections
{
private Comparator compare=null;
public Comparator getCompare()
{
return compare;
}
public void setCompare(Comparator compare)
{
this.compare = compare;
}
public List<Person> sort(List<Person> list)
{
return compare.sort(list);
}
}
5、测试
public class Test
{
public static void main(String[] args)
{
Person p1=new Person(1,"gavin");
Person p2=new Person(2,"aviva");
Person p3=new Person(3,"tom");
Person p4=new Person(4,"jack");
List<Person> person=new ArrayList<Person>();
person.add(p2);
person.add(p4);
person.add(p1);
person.add(p3);
Collections col=new Collections();
//升序排序
col.setCompare(new AscComparator());
person=col.sort(person);
System.out.println(person);
System.out.println("-----------------------");
//降序排序
col.setCompare(new DescComparator());
person=col.sort(person);
System.out.println(person);
}
}
6、总结
在以上的例子中,当我们想改变排序方式时,并不需要改变Collections这个类,只需要按照自己的需要些一个具体策略角色放置到Collections中即可。