策略模式的角色
在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中即可。