需求:根据姓名进行排序,升序或者降序,如果名字一样,就按照id升序排序,用策略模式

步骤一: 定义一个Person对象

public class Person {
private Integer id;
private String name; public Person(Integer id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
setters & getters...
}

步骤二: 定义一个排序的接口

public interface SortInterface {
public void sort(List<Person> list);
}

步骤三: 定义两个策略,升序(UpNameSort)和降序(DownNameSort)

import java.util.Collections;
import java.util.Comparator;
import java.util.List; public class UpNameSort implements SortInterface, Comparator<Person>{ @Override
public int compare(Person o1, Person o2) {
int result = o1.getName().compareTo(o2.getName());
if(result == 0) {
return o1.getId() - o2.getId();
}
return result;
} @Override
public void sort(List<Person> list) {
Collections.sort(list, this);
}
}
import java.util.Collections;
import java.util.Comparator;
import java.util.List; public class DownNameSort implements SortInterface, Comparator<Person>{ @Override
public void sort(List<Person> list) {
Collections.sort(list, this);
} @Override
public int compare(Person o1, Person o2) {
int result = o2.getName().compareTo(o1.getName());
if(result == 0) {
return o1.getId() - o2.getId();
}
return result;
}
}

步骤四: 定义SortEnviroment

import java.util.List;

public class SortEnviroment {
private SortInterface sortInterface; public SortEnviroment(SortInterface sortInterface) {
this.sortInterface = sortInterface;
} public SortEnviroment() {
} public void setSortInterface(SortInterface sortInterface) {
this.sortInterface = sortInterface;
} public void sort(List<Person> list) {
sortInterface.sort(list);
}
}

步骤五:测试

import java.util.ArrayList;
import java.util.List; public class SortTestMain {
public static void main(String[] args) {
Person p1 = new Person(1, "Java");
Person p2 = new Person(2, "Java");
Person p3 = new Person(4, "Hadoop");
Person p4 = new Person(0, "Spark");
Person p5 = new Person(6, "Storm");
Person p6 = new Person(8, "Jvm"); List<Person> sortList = new ArrayList<Person>(); sortList.add(p1);
sortList.add(p2);
sortList.add(p3);
sortList.add(p4);
sortList.add(p5);
sortList.add(p6); SortInterface up = new UpNameSort();
SortEnviroment se = new SortEnviroment(up); se.sort(sortList); for(Person p : sortList) {
System.out.println("name:" + p.getName() + "," + "id:" + p.getId());
} System.out.println("--------------------------"); SortInterface down = new DownNameSort();
se.setSortInterface(down);
down.sort(sortList); for(Person p : sortList) {
System.out.println("name:" + p.getName() + "," + "id:" + p.getId());
} }
}

策略模式--List排序的更多相关文章

  1. 设计模式:策略模式,Java集合定制排序的核心思想

    前言 前阵子面试的时候,有个面试官问我了解哪些设计模式吗?我说了策略模式.接着他问有哪些场景应用,我又回答他jdk的集合工具类有个排序方法就用到了策略模式,也就是java.util包下的Collect ...

  2. JAVA 设计模式之策略模式

    定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换.在前面说过 ...

  3. php实现设计模式之 策略模式

    策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.是一种行为模式. 策略模式包含三种角色 1 抽象策略角色: 策略类,通常由一个接口或 ...

  4. 设计模式-策略模式(Strategy Model)

    1.概述     在开发过程中常常会遇到类似问题,实现一个功能的时候往往有多种算法/方法(策略),我们可以根据环境的不同来使用不同的算法或策略来实现这一功能.     如在人物比较排序的实现中,我们有 ...

  5. Strategy pattern策略模式

    在Java的集合框架中,经常需要通过构造方法传入一个比较器Comparator,或者创建比较器传入Collections的静态方法中作为方法参数,进行比较排序等,使用的是策略模式. 一.策略模式的定义 ...

  6. 策略模式(strategy pattern)

    策略模式在java集合中的TreeSet和TreeMap中得到了很好的应用,我们可以实现Comparator接口实现Compareto()方法来定义自己的排序规则,然后通过TreeSet,TreeMa ...

  7. Java设计模式6:策略模式

    策略模式 策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 策略模式的结构 策略模式是对算法的包 ...

  8. GOF业务场景的设计模式-----策略模式

    定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 策略模式代码实现 interface IStrategy { public void doSomething(); } class ...

  9. 设计模式学习之策略模式(Strategy,行为型模式)(13)

    转载地址:http://www.cnblogs.com/zhili/p/StragetyPattern.html 一.引言 本文要介绍的策略模式也就是对策略进行抽象,策略的意思就是方法,所以也就是对方 ...

随机推荐

  1. WinForm响应式布局设计实践

    引言 创建响应式WinForm应用程序并不那么简单. 响应式布局,在此我指的是应用程序在不同屏幕分辨率下的可用性. 对于WinForm应用程序,我们需要明确地根据分辨率来调整控件的大小和重新定位. 虽 ...

  2. Linux简介与安装

    Linux系统的组成 Linux 内核:内核是系统的"心脏",是运行程序与管理像磁盘和打印机等硬件设备的核心程序. Linux Shell:Shell是系统的用户界面,提供了用户与 ...

  3. 转深入理解 AngularJS 的 Scope作用域

    文章转载英文:what-are-the-nuances-of-scope-prototypal-prototypical-inheritance-in-angularjs 中文:http://www. ...

  4. Go 语言打包静态文件

    对于 Go 语言开发者来说,在享受语言便利性的同时,最终编译的单一可执行文件也是我们所热衷的.但是,一旦遇到我们需要分发的东西不只有可执行文件的时候,事情就变得稍微有点复杂了,例如,需要分发个默认的配 ...

  5. oracle如何导出和导入数据库表

    oracle如何导出和导入数据库表 oracle如何将项目中的表导出后在导入自己的数据库中,这是一个完整的操作,对于数据库备份或在本地查看数据验证数据进场用到,一般情况下我都用dos黑窗口进行操作,简 ...

  6. ZooKeeper 状态机

    ZAB状态机 QuorumPeer这个线程负责状态机的维护 @Override public void run() { ... try { /* * Main loop */ while (runni ...

  7. flask-日料网站搭建-数据库操作

    引言:想使用python的flask框架搭建一个日料网站,主要包含web架构,静态页面,后台系统,交互,目前已经copy完主页,不是前端太慢太慢. 本节知识:数据库的操作,模型建表,更新数据库. py ...

  8. JavaScript中的 true

    经常看到有人写 如下代码,有时候也是凭经验猜想到底是什么意思,本着认真学习 JavaScript 的精神,专门写一篇去讨论这个问题. if(name){ //do something. }else{ ...

  9. struts2中配置文件的调用顺序

    1.default.properties 该文件保存在 struts2-core-2.3.7.jar 中 org.apache.struts2中 2.struts-default.xml 该文件保存在 ...

  10. css样式中如何设置中文字体?

    代码如下: .selector{ font-family: SimHei,"微软雅黑",sans-serif; }  注意:加上中文名“微软雅黑”是为了兼容opera浏览器,中文字 ...