需求:根据姓名进行排序,升序或者降序,如果名字一样,就按照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. Hibernate学习笔记(3)---hibernate关联关系映射

    一对一关联 假设有两个持久化类(实体类)User与Address,它们之间存在一对一的关系 1,通过主键关联(个人偏向另外一种) User.hbm.xml文件配置 <id name=" ...

  2. vue+Element实现静态旅游网站

    页面效果: 1.用vue脚手架:vue-cli,新建一个vue项目. 2.npm run dev后,给小颖了一句提示:Your application is running here:http://l ...

  3. python 命令

    pip list 可以查看已经安装的插件 pip show name 可以查看插件的信息(如:pip show selenium) pip install selenium==[version num ...

  4. vue单页面打包文件大?首次加载慢?按需加载?是你打开方式不对

    部署各vue项目,走了一遍坑.... vue单页面应用刷新404 找到nginx多网站配置文件:类似nginx/sites-available/www.baidu.com server { liste ...

  5. Spring Boot快速入门(三):依赖注入

    原文地址:https://lierabbit.cn/articles/6 spring boot使用依赖注入的方式很简单,只需要给添加相应的注解即可 @Service用于标注业务层组件 @Contro ...

  6. python 数据类型之集合

    一.集合的定义: 定义:由不同元素组成的集合,集合中是一组无序排列的可hash值,可以作为字典的key. 特性:集合的目的是将不同的值存放到一起,不同的集合间用来做关系运算,无需纠结于集合中单个值 二 ...

  7. cs231n spring 2017 lecture7 Training Neural Networks II 听课笔记

    1. 优化: 1.1 随机梯度下降法(Stochasitc Gradient Decent, SGD)的问题: 1)对于condition number(Hessian矩阵最大和最小的奇异值的比值)很 ...

  8. Vijos P1103 校门外的树【线段树,模拟】

    校门外的树 描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……, ...

  9. c#委托事件入门--第一讲:委托入门

    说起委托,有些刚刚入门c#的人感觉很高大上,没有接触过,但是其实很多人都用过Lambda表达式,实际上Lambda表达式就是一个委托. 关于委托入门有个大神写的很详细:张子阳的博客  C#中的委托和事 ...

  10. Java map 详解 - 用法、遍历、排序、常用API等

    尊重原创: http://www.cnblogs.com/lzq198754/p/5780165.html 概要: java.util 中的集合类包含 Java 中某些最常用的类.最常用的集合类是 L ...