策略模式:1.抽象策略类,通常由一个接口或者抽象类实现。 2.具体实现类 3.环境角色类,持有一个策略类的引用,最终给客户端调用。

好了,上代码:

package execrise;

import java.util.List;

/**

* 接口

* @author Administrator

* 2013年5月2日 18:57:16

*/

public interface Strange

{

public void sort(Listlist,int i);

}

package execrise;

import java.util.Collections;

import java.util.Comparator;

import java.util.List;

/**

* 具体实现类

* @author Administrator

* 2013年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 cmp.compare(t2, t1); } }    *

* 知道ReverseComparator2是个内部类,注意这句话 return cmp.compare(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 java.util.Comparator;

import java.util.List;

/**

*

* @author Administrator 2013年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 java.util.Comparator;

import java.util.List;

/**

* @author Administrator

* 2013年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;

/**

* 2013年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;

/**

* 2013年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正序排序)...相关推荐

  1. 两种语言实现设计模式(C++和Java)(三:策略模式)

    策略模式是指定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.也就是说这些算法所完成的功能一样,对外的接口一样,只是各自实现上存在差异.用策略模式 ...

  2. Java中避免if-else-if:策略模式

    本文仅仅为入门,高手勿喷. 实际工作中,我们总会遇到类似如下的需求: 某支付系统接入以下几种商户进行充值:易宝网易,快线网银,19pay手机支付,支付宝支付,骏网一卡通,由于每家充值系统的结算比例不一 ...

  3. java输出不同颜色_Java设计模式-策略模式、状态模式

    推荐阅读: 一只Tom猫:都是"Redis惹的祸",害我差点挂在美团三面,真是"虚惊一场"! java喵:6大面试技能树:JAVA基础+JVM+算法+数据库+计 ...

  4. java 23 种设计模式-23-java 策略模式(Strategy Pattern)

    目录 目录 策略模式 实际案例 定义 测试 实现方式 UML & Code UML Code 系列导航 策略模式 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运 ...

  5. Java实际项目运用之策略模式

    1. 策略模式概要 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理.策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类.用一句话来说,就 ...

  6. Java设计模式(七)策略模式 模板模式

    (十三)策略模式 策略图案限定了多个封装算法,该算法可以相互替换包.法的客户.借用还有一位大神的样例. interface ICalculator{public int calculate(Strin ...

  7. Java描述设计模式(22):策略模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 每年双十一,各大电商平台会推出不同的满减策略,当用户的消费金额满一定额度后,会进行减去一定的优惠额度,从而来一波清仓甩卖,使用策 ...

  8. java设计模式实战-(反射+策略模式)

    学完23种设计模式,相信很多同学都疑问,除了单例模式.工厂模式其他模式还有运用的场景吗? 现在这里就举一个例子. 首先策略模式需要先有了解,我们常用策略模式解决实际开发中的if else特别多的场景. ...

  9. Java设计模式之3种策略模式实现

    一.什么是策略模式   所谓策略模式,就是定义了一组策略,分别封装在不同类中,每种策略都可以根据当前场景相互替换,从而使策略的变化可以独立于操作者.比如我们要去某个地方,会根据距离的不同来选择不同的出 ...

最新文章

  1. PyTorch 笔记(06)— Tensor 索引操作(index_select、masked_select、non_zero、gather)
  2. Erlang的边界检查(3)
  3. 1094 The Largest Generation (25 分)【难度: 一般 / 树的遍历】
  4. 创建线程的办法 java 1615387415
  5. python实用技巧(一)
  6. apache php mysql_PHP环境搭建(php+Apache+mysql)
  7. Linux系统学习之文件管理
  8. MethodFilterInterceptor(方法拦截器)配置excludeMethors
  9. SQL server连接数据库
  10. VMware虚拟机中Linux系统如何修改IP地址
  11. sourceoffsite,sos_collab,版本控制,安装过程中不能创建数据,相关服务无法启动
  12. spring框架特点
  13. BZOJ 2434 阿狸的打字机(fail树)
  14. Java GridFS MongoDB 下载文件 内容不完整
  15. Java实现求质数(素数)
  16. Qt入门-文本框类QLineEdit和QTextEdit
  17. jstree获得节点的值
  18. shell删除指定时间之前的文件
  19. M87 黑洞照片的捕捉背后,这个程序媛功不可没
  20. python批量写入数据

热门文章

  1. 响应状态码1xx , 2xx,3xx , 4xx , 5xx
  2. mac安装软件提示没有权限
  3. 神经网络和深度学习的简史
  4. 国家及地区MySQL数据
  5. php商品浏览页面,jquery仿京东商品放大浏览页面_实例分享
  6. nginx上传文件大小报错500
  7. 视频教程-shader 基础之 2D技巧集合-Unity3D
  8. JavaScript学习--我的第一次作业
  9. 学计算机未来的规划,未来学习计划范本
  10. wps 甘特图_「WPS办公助手」3分钟画出高逼格流程图,工作学习规划一目了然,老板都要为你点赞...