策略模式--List排序
需求:根据姓名进行排序,升序或者降序,如果名字一样,就按照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排序的更多相关文章
- 设计模式:策略模式,Java集合定制排序的核心思想
前言 前阵子面试的时候,有个面试官问我了解哪些设计模式吗?我说了策略模式.接着他问有哪些场景应用,我又回答他jdk的集合工具类有个排序方法就用到了策略模式,也就是java.util包下的Collect ...
- JAVA 设计模式之策略模式
定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换.在前面说过 ...
- php实现设计模式之 策略模式
策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.是一种行为模式. 策略模式包含三种角色 1 抽象策略角色: 策略类,通常由一个接口或 ...
- 设计模式-策略模式(Strategy Model)
1.概述 在开发过程中常常会遇到类似问题,实现一个功能的时候往往有多种算法/方法(策略),我们可以根据环境的不同来使用不同的算法或策略来实现这一功能. 如在人物比较排序的实现中,我们有 ...
- Strategy pattern策略模式
在Java的集合框架中,经常需要通过构造方法传入一个比较器Comparator,或者创建比较器传入Collections的静态方法中作为方法参数,进行比较排序等,使用的是策略模式. 一.策略模式的定义 ...
- 策略模式(strategy pattern)
策略模式在java集合中的TreeSet和TreeMap中得到了很好的应用,我们可以实现Comparator接口实现Compareto()方法来定义自己的排序规则,然后通过TreeSet,TreeMa ...
- Java设计模式6:策略模式
策略模式 策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 策略模式的结构 策略模式是对算法的包 ...
- GOF业务场景的设计模式-----策略模式
定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 策略模式代码实现 interface IStrategy { public void doSomething(); } class ...
- 设计模式学习之策略模式(Strategy,行为型模式)(13)
转载地址:http://www.cnblogs.com/zhili/p/StragetyPattern.html 一.引言 本文要介绍的策略模式也就是对策略进行抽象,策略的意思就是方法,所以也就是对方 ...
随机推荐
- 关于php变量的赋值和引用的区别
刚开始学习php,发现有些地方和js语法不同,所以记录下来. 这篇文章是总结php中变量赋值和引用的区别. 我们知道,js中,原始类型的赋值,是将值直接复制给变量:引用类型的赋值,是将内存地址复制给变 ...
- Java框架之Spring MVC(二)
一.Spring MVC 验证 JSR 303 是ajvaEE6 中的一项子规范 ,叫 Bean Validation 用于对javaBean中的字段进行校验. 官方的参考实现是: Hibernate ...
- Caused by: org.xml.sax.SAXParseException; systemId: file:/home/hadoop/hive-0.12.0/conf/hive-site.xml; lineNumber: 5; columnNumber: 2; The markup in the document following the root element must be well
1:Hive安装的过程(Hive启动的时候报的错误),贴一下错误,和为什么错,以及解决方法: [root@master bin]# ./hive // :: INFO Configuration.de ...
- IIS 应用程序池自动停止
IIS7 .NET Runtime version 2.0.50727.5420 - 执行引擎错误(000007FEE77AAF0E) (80131506) 装完系统,配置完IIS,发现.NET程序报 ...
- 1、ABPZero系列教程之拼多多卖家工具 前言
此系列文章围绕着拼多多卖家工具来介绍ABPZero的使用,内容包括手机登录.手机注册.拼团提醒.微信公众号绑定帐号.有拼团发送消息到微信公众号(只要关注过微信公众号并已绑定系统帐号). 学习此系列必备 ...
- 希尔排序(Go语言)
func ShellSort(num []int) { //increment相隔数量 ;increment> ;increment/= { //i序号较大的数组下标,i ,j进行比较 for ...
- JSP和Servlet笔记
一.JSP的3个编译指令 作用:page指令用于设置整个jsp页面相关的属性,比如页面的编码格式.所包含的文件等等,它们包含在<%@ page %>标记中. 1)page 指令 以 ...
- 加载进度圈,带遮罩层(jquery)
如图: Js下载地址:http://files.cnblogs.com/files/holdon521/cvi_busy_lib.js 如下使用实例: <script src="/st ...
- 基于Grafana+SimpleJson的灵活报表解决方案
在时序分析及监控展现领域,Grafana无疑是开源解决方案中的翘楚,其灵活的插件机制,支持各种漂亮的面板.丰富的数据源以及强大的应用.典型的面板有Graph.Text.Singlestat.PieCh ...
- centos6.x升级protobuf操作流程.
1.首先卸载protobuf,使用命令如下: sudo yum remove protobuf 2.下载protobuf源,依据自己的需要下载: 2.1下载地址:https://github.com/ ...