策略模式:其实就是java的多态。。。父类引用指向子类对象。

使用策略模式,改善排序算法上文中需要排序的是一个数组 让他可以对任何类型的数组进行排序

1.利用 接口 Comparable<T>

  只要数组里面的这些个对象,都去实现 comparable接口, 然后实现compareTo()方法。

int compareTo(T o) 
          比较此对象与指定对象的顺序。

举例 我们想比较在比较一个对象Cat 只需要让Cat对象去实现Comparable接口

public class Cat implements Comparable<Cat>{
private int height; public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
} /**
* 下面是自己定义的比较策略
* 如果本对象比穿过来的对象的高度高 就返回1
* 如果没有参数传过来的对象高 就返回-1
* 相等返回0
*/
@Override
public int compareTo(Cat cat) {
if(this.getHeight()>cat.getHeight()){
return 1;
}else if(this.getHeight()<cat.getHeight()){
return -1;
}else{
return 0;
}
}
}

然后修改一下 我们的比较接口

/**
* 然后修改我们的排序算法,
* 这样我们的排序算法 就可以比较任何类而不用做任何改动
* 前提是需要比较的类必须实现comparable接口()
*/
public class SelectionSort {
//TODO java不允许创建泛型数组 不知道为何,所以代码有些黄色警告,不过并不影响本文所说的策略模式
public static void sort(Object[] arr){
int len = arr.length;
for(int i=0;i<len;i++){
//寻找i到len里面的最小值 并把最小值的索引存在minIndex当中 即 寻找最小值的索引
int minIndex = i;
for( int j = i + 1 ; j < len ; j ++ ){//i + 1
Comparable o1 =(Comparable)arr[j];
Comparable o2 =(Comparable)arr[minIndex];
if( o1.compareTo(o2)==-1 ){ //等于-1 就说明arr[j]<arr[minIndex]
minIndex = j; //不断的寻找 最小值的索引
}
}
swap( arr , i , minIndex); //找到最小值后和当前没有排序的第一个位置进行交换位置
}
} private static void swap(Object[] arr, int i, int j) {
Object t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}

这种利用Comparable的优点就是 我们的排序算法只需要写一次,对所有类都可以支持。

(JDK String int Long float 都已经内部帮我们实现了comparable接口 我们可以直接用 comparableTo()进行比较这些基本类型)

jdk对策略模式的补充

以上代码 在Cat中 我们把比较策略(这可能就是策略模式名字的来源吧) 写死了,现在我们不光想要把我们的算法策略抽出来,我们也想把比较策略抽出来。

现在介绍另一个接口

接口 Comparator<T>

int compare(T o1, T o2) 
          比较用来排序的两个参数。

可以发现 此接口也存在一个comparableTo() 方法,但是与之前不同的是,此方法要接收两个对象

public class Cat implements Comparable<Cat>{

    //可以写成多态
Comparator<Cat> comparator = new CatHeightComparator<Cat>(); private int height; public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
} //把具体怎么样比较的代码 写在一个比较器中,而不是写在类本身的代码里(同一个类在不同的业务中 可能有不同的比较方法)
@Override
public int compareTo(Cat cat) {
return comparator.compare(this, cat);
} Cat(int height){
this.height=height;
} //比较器
public class CatHeightComparator<T> implements Comparator<T> {
@Override
public int compare(T o1, T o2) {
Cat c1 = (Cat) o1;
Cat c2 = (Cat) o2;
if(c1.getHeight()>c2.getHeight()){
return 1;
}
if(c1.getHeight()<c2.getHeight()){
return -1;
}
return 0;
}
} //main方法测试
public static void main(String[] args) {
Cat[] a ={new Cat(2),new Cat(3) ,new Cat(1)};
SelectionSort.sort(a);
for (Cat cat : a) {
System.out.println(cat.getHeight());
}
}
}

策略模式 看起来就是多态和封装。

不仅是策略模式 java所有的设计模式 都是多态和封装的应用

补充:JDK中

java.util.Arrays 有一个sort()方法
static

<T> void
sort(T[] a, Comparator<? super T> c) 
          根据指定比较器产生的顺序对指定对象数组进行排序。
java.util.Collections 也有一个sore()方法
static

<T> void
sort(List<T> list, Comparator<? super T> c) 
          根据指定比较器产生的顺序对指定列表进行排序。

 o1 - 要比较的第一个对象。o2 - 要比较的第二个对象。

  根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。


 

JDK设计模式之——策略模式(Comparable和Comparator接口)的更多相关文章

  1. 设计模式:策略模式(Strategy)

    定   义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...

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

    前提: 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查 找.排序等,一种常用的方法是硬编码(Hard Cod ...

  3. JavaScript设计模式之策略模式(学习笔记)

    在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选 ...

  4. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  5. JavaScript设计模式之策略模式

    所谓"条条道路通罗马",在现实中,为达到某种目的往往不是只有一种方法.比如挣钱养家:可以做点小生意,可以打分工,甚至还可以是偷.抢.赌等等各种手段.在程序语言设计中,也会遇到这种类 ...

  6. 设计模式之策略模式(Strategy Pattern)

    模板方法是通过继承实现的,在父类中定义出算法的骨架,将不同点在子类中实现.而策略模式是通过接口实现的,策略中定义了完整的算法.它们有点像啊-- 策略模式的定义 策略模式(Strategy Patter ...

  7. 【设计模式】【应用】使用模板方法设计模式、策略模式 处理DAO中的增删改查

    原文:使用模板方法设计模式.策略模式 处理DAO中的增删改查 关于模板模式和策略模式参考前面的文章. 分析 在dao中,我们经常要做增删改查操作,如果每个对每个业务对象的操作都写一遍,代码量非常庞大. ...

  8. [design-patterns]设计模式之一策略模式

    设计模式 从今天开始开启设计模式专栏,我会系统的分析和总结每一个设计模式以及应用场景.那么首先,什么是设计模式呢,作为一个软件开发人员,程序人人都会写,但是写出一款逻辑清晰,扩展性强,可维护的程序就不 ...

  9. 设计模式入门,策略模式,c++代码实现

    // test01.cpp : Defines the entry point for the console application.////第一章,设计模式入门,策略模式#include &quo ...

随机推荐

  1. java Quartz任务调度器

    1.quarz对java1.5实现的简单调度做了封装 /**     * quartz对任务调度进了高度抽象: 1调度器:2任务:3触发器     * Job接口(任务):定义需要调度的任务     ...

  2. Linux任务计划命令 :crontab -e

    crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond ...

  3. 微信小程序 - 曲线图

    最近要做微信小程序,项目中需要曲线图显示数据,所以在网上看了一下找了很久都没有找到一个,不知道是我查找的姿势不对,还是什么的.所以就自己做了一个曲线图,现在分享给大家. wxml代码: <can ...

  4. 构建器Constructor的返回值/构建器

    构建器Constructor的返回值? 为什么会有这个问题? 在<Thinking in Java>中文Quanke翻译版本第四章初始化和清除,原书第五章Initialization&am ...

  5. Java实现AES加密,异常java.security.InvalidKeyException: Illegal key size 的解决

    Java实现AES加密,抛出异常如下:java.security.InvalidKeyException: Illegal key size 代码参考 http://my.oschina.net/Ja ...

  6. js的map方法遍历数组

    map方法有返回值,返回值用变量接收. 例子: var num = [1, 2, 3]; var newNum = num.map((ele, index) => { return ele + ...

  7. C++枚举类型Enum及C++11强枚举类型用法

    C++中的枚举类型常常和switch配合使用,这里用一个简单的switch控制键盘回调的代码片段来说明枚举的用法: //W A S D 前.后.左.右行走 enum Keydown{ Forward= ...

  8. thinkphp5省市区三级联动例子

    数据库 数据库下载地址:https://files.cnblogs.com/files/fan-bk/packet_region.zip php <?php namespace app\inde ...

  9. 申请的阿里云主机ubuntu系统无法显示中文

    系统ubuntu 16.04,中文的文件名也无法显示,因为中文包没安装,安装如下: sudo apt-get -y install language-pack-zh-hans sudo apt-get ...

  10. OpenCV Mat格式存储YUV图像

    YUV图像用的比较多,而且YUV图像的格式众多(YUV格式可以参考YUV pixel formats),如何用OpenCV的Mat类型来存储YUV图像也是经常遇到的问题. 对于YUV444图像来说,就 ...