策略模式:1.抽象策略类,通常由一个接口或者抽象类实现。 2.具体实现类 3.环境角色类,持有一个策略类的引用,最终给客户端调用。
好了,上代码:
package execrise;
import java.util.List;
/**
* 接口
* @author Administrator
* 5月2日 18:57:16
*/
public interface Strange
{
public void sort(Listlist,int i);
}
package execrise;
import java.util.Collections;
import parator;
import java.util.List;
/**
* 具体实现类
* @author Administrator
* 5月2日 18:56:23
*/
public class FindByID implements Strange
{
public int k;
@Override
public void sort(Listlist, int i)
{
System.out.println("i==" + i);
if (i == 1)// j=1 倒序
{
this.k = i;
Collections
.sort(list, Collections.reverseOrder(new MyComparator()));
}
else if (i == 0)// i=0 正序
{
Collections
.sort(list, Collections.reverseOrder(new MyComparator()));
}
else
{
System.out.println("请输入0或者1(0代表正序,1代表倒序) ");
}
}
private class MyComparator implements Comparator{
@Override
public int compare(Person o1, Person o2)
{
/*
* 我当时纳闷,我没有调用compare()方法,我们知道Collections.reverseOrder()括号里是一个指定的比较器,
* 可是我怎么确定我的compare()方法起作用,被调用呢???于是有了如下打印语句。证明确实调用了自己重写的方法。
* 那谁调用呢???? 一定是reverseOrder()这个方法。于是跟踪源码。如下: public static * ComparatorreverseOrder(Comparatorcmp) { if (cmp == null)
* return reverseOrder(); return new ReverseComparator2(cmp); } * 继续跟踪 ---> ReverseComparator2....源码如下:
*
* private static class ReverseComparator2implements
* Comparator,Serializable { private static final long
* serialVersionUID = 4374092139857L; private Comparatorcmp;
*
* ReverseComparator2(Comparatorcmp) { assert cmp != null;
* this.cmp = cmp; }
*
* public int compare(T t1, T t2) { return pare(t2, t1); } } *
* 知道ReverseComparator2是个内部类,注意这句话 return pare(t2,
* t1);这句就是调用我们自己的compare()方法。呵呵,低调低调。。。 */
System.out.print("1" + " ");
if (k == 0)
{
System.out.print("2" + " ");
return o2.getId() - o1.getId();/* 因为正序,所以根据第一个参数大于第二个参数返回正整数。 */
}
else
{
System.out.print("3" + " ");
return o1.getId() - o2.getId();/*比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。*/
}
}
}
}
package execrise;
import java.util.Collections;
import parator;
import java.util.List;
/**
*
* @author Administrator 5月2日 18:57:55
*/
public class FindByName implements Strange
{
int k;
@Override
public void sort(Listlist, int i)
{
if (i == 1)// j=1 倒序
{
this.k = i;
Collections
.sort(list, Collections.reverseOrder(new MyComparator()));
}
else if (i == 0)// i=0 正序
{
Collections
.sort(list, Collections.reverseOrder(new MyComparator()));
}
else
{
System.out.println("请输入0或者1(0代表正序,1代表倒序) ");
}
}
private class MyComparator implements Comparator{
@Override
public int compare(Person o1, Person o2)
{
if (k == 0)
{
return o2.getName().compareTo(o1.getName());
}
else
{
return o1.getName().compareTo(o2.getName());
}
}
}
}
package execrise;
import java.util.Collections;
import parator;
import java.util.List;
/**
* @author Administrator
* 5月2日 18:58:27
*/
public class FindByAge implements Strange
{
int k;
@Override
public void sort(Listlist, int i)
{
if (i == 1)// j=1 倒序
{
this.k = i;
Collections
.sort(list, Collections.reverseOrder(new MyComparator()));
}
else if (i == 0)// i=0 正序
{
Collections
.sort(list, Collections.reverseOrder(new MyComparator()));
}
else
{
System.out.println("请输入0或者1(0代表正序,1代表倒序) ");
}
}
private class MyComparator implements Comparator{
@Override
public int compare(Person o1, Person o2)
{
if (k == 0)
{
return o2.getAge() - o1.getAge();
}
else
{
return o1.getAge() - o2.getAge();
}
}
}
}
package execrise;
import java.util.List;
/**
* 5月2日 18:59:12
*
* @author Administrator
*
*/
public class Envrioment
{
Envrioment()
{
}
Envrioment(Strange strange)
{
this.strange = strange;
}
private Strange strange;
public Strange getStrange()
{
return strange;
}
public void setStrange(Strange strange)
{
this.strange = strange;
}
public void invoke(Listlist, int i)
{
strange.sort(list, i);
}
}
package execrise;
import java.util.ArrayList;
/**
* 5月2日 19:01:02
* @author Administrator
* 客户端
*/
public class Client
{
public static void main(String[] args)
{
ArrayListlist = new ArrayList();
Person p1 = new Person(1, "a", 34);
Person p2 = new Person(2, "b", 24);
Person p3 = new Person(3, "c", 24);
Person p4 = new Person(4, "bb", 24);
Person p5 = new Person(5, "ba", 24);
Person p6 = new Person(6, "d", 24);
Person p7 = new Person(7, "d", 24);
Person p8 = new Person(8, "d", 25);
Person p9 = new Person(9, "d", 25);
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
list.add(p6);
list.add(p7);
list.add(p8);
list.add(p9);
Envrioment e = new Envrioment();
e.setStrange(new FindByID());
int i = 0;// i=0 正序
int j = 1;// j=1 倒序
System.out.println("按照person id 正序排序");
e.invoke(list, i);
for(Person al:list)
{
System.out.println("id="+al.getId()+" name="+al.getName()+" age="+al.getAge());
}
System.out.println("按照person id 降序排序");
e.invoke(list, j);
for(Person a2:list)
{
System.out.println("id="+a2.getId()+" name="+a2.getName()+" age="+a2.getAge());
}
System.out.println("按照person name 正序排序,如果name相同,按照id正序排序");
Envrioment e1 = new Envrioment(new FindByName());
e1.invoke(list, i);
for(Person al:list)
{
System.out.println("id="+al.getId()+" name="+al.getName()+" age="+al.getAge());
}
System.out.println("按照person name 降序排序,如果name相同,按照id正序排序");
e1.invoke(list, j);
for(Person a2:list)
{
System.out.println("id="+a2.getId()+" name="+a2.getName()+" age="+a2.getAge());
}
System.out.println("按照person age 正序排序,如果age相同,按照id正序排序");
Envrioment e2 = new Envrioment(new FindByAge());
e2.invoke(list, i);
for (Person al : list)
{
System.out.println("id=" + al.getId() + " name=" + al.getName()
+ " age=" + al.getAge());
}
System.out.println("按照person age 降序排序,如果age相同,按照id正序排序");
e2.invoke(list, j);
for (Person a1 : list)
{
System.out.println("id=" + a1.getId() + " name=" + a1.getName()
+ " age=" + a1.getAge());
}
}
}
输出结果:
按照person id 正序排序
i==0
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
id=1 name=a age=34
id=2 name=b age=24
id=3 name=c age=24
id=4 name=bb age=24
id=5 name=ba age=24
id=6 name=d age=24
id=7 name=d age=24
id=8 name=d age=25
id=9 name=d age=25
按照person id 降序排序
i==1
1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3
id=9 name=d age=25
id=8 name=d age=25
id=7 name=d age=24
id=6 name=d age=24
id=5 name=ba age=24
id=4 name=bb age=24
id=3 name=c age=24
id=2 name=b age=24
id=1 name=a age=34
按照person name 正序排序,如果name相同,按照id正序排序
id=1 name=a age=34
id=2 name=b age=24
id=5 name=ba age=24
id=4 name=bb age=24
id=3 name=c age=24
id=9 name=d age=25
id=8 name=d age=25
id=7 name=d age=24
id=6 name=d age=24
按照person name 降序排序,如果name相同,按照id正序排序
id=9 name=d age=25
id=8 name=d age=25
id=7 name=d age=24
id=6 name=d age=24
id=3 name=c age=24
id=4 name=bb age=24
id=5 name=ba age=24
id=2 name=b age=24
id=1 name=a age=34
按照person age 正序排序,如果age相同,按照id正序排序
id=7 name=d age=24
id=6 name=d age=24
id=3 name=c age=24
id=4 name=bb age=24
id=5 name=ba age=24
id=2 name=b age=24
id=9 name=d age=25
id=8 name=d age=25
id=1 name=a age=34
按照person age 降序排序,如果age相同,按照id正序排序
id=1 name=a age=34
id=9 name=d age=25
id=8 name=d age=25
id=7 name=d age=24
id=6 name=d age=24
id=3 name=c age=24
id=4 name=bb age=24
id=5 name=ba age=24
id=2 name=b age=24
java 正序a~z_java 策略模式 list集合 实现id 姓名年龄正序倒序排序(如果年龄或者姓名重复 按id正序排序)...