策略模式--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 一.引言 本文要介绍的策略模式也就是对策略进行抽象,策略的意思就是方法,所以也就是对方 ...
随机推荐
- JS 实现图片的预加载(转载)
图片预加载是web开发中一种应用相当广泛的技术,比如我们在做图片翻转显示等特效的时候,为了让图片在转换的时候不出现等待,我们最好是先让图片下载到本地,然后在继续执行后续的操作. 下面的函数实现了一个我 ...
- kotlin的方言(语法糖)
概述 之前介绍了kotlin的快速入门,http://www.cnblogs.com/lizo/p/7231167.html 大多数还是参照java.kotlin中提供了更多更方便的语言特性 这个方言 ...
- python3基础(一)
1. python文件主程序入口文件一般来要申明python路径,编码信息,作者说明等: #!/usr/bin/env python # _*_ coding: utf-8 _*_ # Author: ...
- Java学习笔记1(HelloWorld)
编写HelloWorld是一种仪式: 1.下载JDK,安装,注意路径中不要存在中文. 2.添加环境变量,加入bin目录 3.写一个文本,内容如下,后缀改成.java,注意文本的名称为HelloWorl ...
- 6年后的第一篇博客:进入java的精彩世界
10的.NET从业经验,也算资深人士了. 2018开始,正式进入JAVA的世界. 为什么说正式?因为已经附带有几年ANDROID经验了,确切的说,是正式进入JAVA服务器端. 没有任何人要求,纯粹是个 ...
- ajax struts2 数据的返回形式
这篇随笔算是接上篇的数据请求返回,上一篇关于分页用的返回的数据形式是json,http://www.cnblogs.com/tele-share/p/7192206.html这次主要探讨ajax从st ...
- 驱动开发入门——NTModel
上一篇博文中主要说明了驱动开发中基本的数据类型,认识这些数据类型算是驱动开发中的入门吧,这次主要说明驱动开发中最基本的模型--NTModel.介绍这个模型首先要了解R3层是如何通过应用层API进入到内 ...
- php 抽象类和接口类
PHP中抽象类和接口类都是特殊类,通常配合面向对象的多态性一起使用. 相同: ①两者都是抽象类,都不能实例化. ②只有接口类的实现类和抽象类的子类实现了 已经声明的 抽象方法才能被实例化. 不同: ① ...
- springboot(十七):使用Spring Boot上传文件
上传文件是互联网中常常应用的场景之一,最典型的情况就是上传头像等,今天就带着带着大家做一个Spring Boot上传文件的小案例. 1.pom包配置 我们使用Spring Boot最新版本1.5.9. ...
- springmvc json数据返回前台,中文乱码
@ResponseBody@RequestMapping(value = "selectProvinces",produces = "text/json;charset= ...