实现过程也是用了java的策略模式的概念,刚好回顾以往所学知识。
1:定义比较对象属性
/*
* 需要进行策略比较的对象
*/
public class Person {
private String name;
private int Id;
private int age;
public Person(String name,int age,int Id){
this.age = age;
this.name = name;
this.Id = Id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return Id;
}
public void setId(int id) {
Id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2:比较策略的公共接口
/*
* 策略模式的公共接口
*/
public interface Strategy {
public void sort(List<Person> list);
}
3:比较策略接口的实现类
/*
* 按照ID排序的策略类,实现Strategy策略接口
*/
public class StrategyById implements Strategy, Comparator<Person> {
private boolean AscFlag;//true--表示升序;false---表示降序
public StrategyById(boolean AscFlag){
this.AscFlag = AscFlag;
}
@Override
public void sort(List<Person> list) {
//StrategyById(AscFlag) 既是策略类有事比较器的实现 Collections.sort(List<Person> list, Comparator<? super Person>c)
Collections.sort(list, new StrategyById(AscFlag));
}
@Override
public int compare(Person o1, Person o2) {//按照Id排序
int result = o1.getId() -o2.getId();
return AscFlag?result:-result;
}
}
/*
* 按照Age排序的策略类,实现Strategy策略接口
*/
public class StrategyByAge implements Comparator<Person>, Strategy {
private boolean AscFlag;//true--表示升序;false---表示降序O
public StrategyByAge(boolean AscFlag){
this.AscFlag = AscFlag;
}
@Override
public void sort(List<Person> list) {
Collections.sort(list, new StrategyByAge(AscFlag));
}
@Override
public int compare(Person o1, Person o2) {
int result = o1.getAge() - o2.getAge();/
if(result == 0){//0--表示年龄相同
return o1.getId() - o2.getId();
}
return AscFlag?result:-result;
}
}
/*
* 按照姓名排序的策略类,实现Strategy策略接口
*/
public class StrategyByName implements Strategy, Comparator<Person>{
private boolean AscFlag;//true--表示升序;false---表示降序
public StrategyByName(boolean AscFlag){
this.AscFlag = AscFlag;
}
@Override
public int compare(Person o1, Person o2) {
//姓名一样的话按照Id升序
int result = o1.getName().compareTo(o2.getName());//0-相等;-1--升序;1降序
if(result == 0){
return o1.getId() - o2.getId();
}
return AscFlag?result:-result;//AscFlag-true 升序排
}
@Override
public void sort(List<Person> list) {
Collections.sort(list, new StrategyByName(AscFlag));
}
}
4、定义策略类的执行环境类
/*
* 在使用策略对象的类中保存一个对策略对象的引用。实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值。
*/
public class Environment {
private Strategy strategy;
private List<Person> list;
public Environment(Strategy strategy,List<Person> list){
this.list = list;
this.strategy = strategy;
}
public void sort(){
this.strategy.sort(list);
}
}
5、测试
public class Client {
public static void main(String[] args) {
ArrayList<Person> list = new ArrayList<Person>();
list.add(new Person("zhangsan",28,11));
list.add(new Person("zhangsan",28,12));
list.add(new Person("lisi",27,10));
list.add(new Person("lisi",28,9));
list.add(new Person("wangwu",30,8));
list.add(new Person("zhaoliu",30,7));
list.add(new Person("housi",22,6));
list.add(new Person("feiyang",32,4));
Environment environment = null ;
environment = new Environment(new StrategyById(true), list);//按照ID正序
environment.sort();
System.out.println("====按照ID正序排列===");
for(Person p: list){
System.out.println(p.getId()+" "+p.getName()+" "+p.getAge());
}
environment = new Environment(new StrategyById(false), list);//按照ID倒序
environment.sort();
System.out.println("====按照ID倒序排列===");
for(Person p: list){
System.out.println(p.getId()+" "+p.getName()+" "+p.getAge());
}
environment = new Environment(new StrategyByName(true), list);//按照ID正序
environment.sort();
System.out.println("====按照name正序排列===");
for(Person p: list){
System.out.println(p.getId()+" "+p.getName()+" "+p.getAge());
}
environment = new Environment(new StrategyByName(false), list);//按照ID倒序
environment.sort();
System.out.println("====按照Name倒序排列===");
for(Person p: list){
System.out.println(p.getId()+" "+p.getName()+" "+p.getAge());
}
environment = new Environment(new StrategyByAge(true), list);//按照ID正序
environment.sort();
System.out.println("====按照Age正序排列===");
for(Person p: list){
System.out.println(p.getId()+" "+p.getName()+" "+p.getAge());
}
environment = new Environment(new StrategyByAge(false), list);//按照ID倒序
environment.sort();
System.out.println("====按照Age倒序排列===");
for(Person p: list){
System.out.println(p.getId()+" "+p.getName()+" "+p.getAge());
}
}
}