现在这个Comparable接口的作用是什么呢,我们定义DataSorter之后,在使用它的sort方法之后,但你不会模式的时候,你用框架,很多问题你理解不了
package com.learn.stratege;public class DataSorter {/*** 我们定义DataSorter之后,在使用它的sort方法之后,* 我们都要假设他所有的都要实现Comparable接口的,* 因为你不实现Comparable接口,你会发现我下面的比较大就没法写了* 所以Comparable接口你还是要去实现,* 只是当你去实现Comparable接口的时候* * 如果这里的参数写成Comparable不用转型了,但是当别人调用sort的时候,* 是不是也要进行转型,也就是在Test里面调用sort的时候,你要不要对她进行转型* JDK是泛型的实现,这里其实是可以写Comparable* 所以模式最重要的目的不是要大家在实际工作之中你用模式可以开发出框架,* 而是在用别人东西的时候,你的理解会更透彻,* * 我们这里只能自己的模式来理解comparable和comparator* JDK给我们的Comparable和Comparator,* 首先来看Comparable<T>接口,这个接口就非常简单了,在这里最麻烦的是T* 我演示一下Comparable接口到底该怎么用,T该怎么指定* 如果我在这里写Object的话,就像我们刚才模拟的那样,那你每次都要对Object进行转型* 比如是猫你就要强制转换成猫,是狗你就要强制转换成狗,那我能不能说我在实现接口的时候* 就规定了就和猫比较大小,不喝其他类型比较大小,泛型指的就是这个意思,* 当你在实现Comparable接口的时候,可以指定我只和那种类型的数据比较大小* * 既然我们是使用JDK的Comparable接口实现的话,我们也需要明确的告诉它* * 他跟我们实现的区别是他使用了泛型,而泛型不知道我们有没有看懂,* 其实非常简单,当你看到一个类里面带了尖括号的时候,他使用泛型的时候,* 你想使用他,做这个类的定义和声明,或者是返回值,或者声明变量的时候* 在后面也跟上个尖括号,然后把你想要的类型往里填就行了* 这样在他们的方法里面,不管是返回值还是参数,泛型的好处就是我们不要再做强制转换了* 别的都一样,你现在再看Comparable和Comparator接口的时候,* 你现在已经应该明白了* * 我们最开始写了一个sort算法,我们的目的是为了让sortz算法得到复用,* 不管是什么类型的对象,都可以去实现排序,我只能让实现排序的类去实现一个接口Comparable,* 只要实现Comparable接口就必须实现compareTo这个方法,根据compareTo方法当然就可以* 对这个类的两个对象来比较大小了,但是比较大小如果你只是实现compareTo方法写死它的话,* 这个逻辑还是不够灵活,最好是让两种具体的策略将来也进行扩展,所以我们引入Comparator接口,* 对于Comparator接口来说,他的比较策略是不固定的,你可以去实现自己的比较策略,* 然后交给具体的Cat来比较大小,这样也是在具体的策略上实现扩展* * @param a*/public static void sort(Object[] a) {for(int i=a.length;i>0;i--) {for(int j=0;j<i-1;j++) {java.lang.Comparable o1 = (java.lang.Comparable)a[j];java.lang.Comparable o2 = (java.lang.Comparable)a[j+1];if((o1.compareTo(o2))==1) {swap(a,j,j+1);}}}}private static void swap(Object[] a, int x, int y) {Object temp = a[x];a[x] = a[y];a[y] = temp;}public static void sort(int[] a) {for(int i=0;i<a.length;i--) {for(int j=0;j<i-1;j++) {if(a[j]>a[j+1]) {swap(a,j,j+1);}}}}private static void swap(int[] a, int x, int y) {int temp = a[x];a[x] = a[y];a[y] = temp;}public static void p(int[] a) {for(int i=0;i<a.length;i++) {System.out.print(a[i] + " ");}System.out.println();}public void p(Object[] a) {for(int i=0;i<a.length;i++) {System.out.print(a[i] + " ");}System.out.println();}}
package com.learn.stratege;/*** 这次我就不是实现自己的Comparable接口了* 而是java.lang.Comparable,去实现这个接口的时候* 我可以直接定义只和猫比较大小* @author Leon.Sun**/
public class Cat implements java.lang.Comparable<Cat> {private int height;/*** 如果我们要使用JDK里面自带的时候,* 我指定就是用Cat,就是用Cat进行比较* 把这里要写清楚,因为两个类名会混淆* 当然还有一种方式是在上面明确的做引入* 这样我们就使用了JDK给我们的Comparator* JDK给我们的Comparator需要泛型* 到底指定哪种类型的进行比较* 这样我就省了强制转换了* */private java.util.Comparator comparator = new CatHeightComparator();//private java.util.Comparator<Cat> comparator = new CatWeightComparator();private int weight;public Cat() {super();}public Cat(int height, int weight) {super();this.height = height;this.weight = weight;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}public int getWeight() {return weight;}public void setWeight(int weight) {this.weight = weight;}@Overridepublic String toString() {return "Cat [height=" + height + ", weight=" + weight + "]";}public java.util.Comparator getComparator() {return comparator;}public void setComparator(java.util.Comparator comparator) {this.comparator = comparator;}/*** 既然你只和猫比较大小* 直接在这里写只和猫比较大小,当然对于Comparator来说* 他也有这样的要求,这个Comparator目前是自己定义的Comparator* 我们看看JDK给我们的Comparator,是java.util这个包里面的* JDK给我们的Comparator<T>也有一个括号,在尖括号里面写了个T,* compare(T o1,T o2),其实非常简单,你把T换成2我们想要的那种类型* 替换完了之后参数直接写这个类型了,* @param o* @return*/@Overridepublic int compareTo(Cat o) {return comparator.compare(this, o);}}
package com.learn.stratege;/*** 对于我们的CatHeightComparator也要实现java.util.Comparator* * @author Leon.Sun**/
public class CatHeightComparator implements java.util.Comparator<Cat> {/*** 那么这里面直接写Cat就可以了* @param o1* @param o2* @return*/@Overridepublic int compare(Cat o1, Cat o2) {Cat c1 = (Cat)o1;Cat c2 = (Cat)o2;if(c1.getHeight()>c2.getHeight()) {return 1;}else if(c1.getHeight()<c2.getHeight()) {return -1;}return 0;}}
package com.learn.stratege;/*** 你可以发现他已经排好顺序了* @author Leon.Sun**/
public class Test {public static void main(String[] args) {DataSorter dataSorter = new DataSorter();   /*** 顺序是怎么排的,当你new出三只猫出来的时候,我们把猫交给Sort方法,*/Cat[] a = {new Cat(8,8),new Cat(2,2),new Cat(1,1)};/*** 因为在java.util.Arrays.sort()它里面有一个方法,封装了对于数组的常用的操作* 它里面有一个方法就是对于Object的一个排序,你只要把a传进去* 他就自动的帮你排好顺序了,而且只要你实现Comparable接口就可以* 所以说数据结构和算法在工作中不重要,原因很简单,* 因为JDK已经帮你封装好了,就算JDK没有帮你封装好,* 你从网上下载其他的类库,也会帮你封装的非常的好,我们来读一下这个类Arrays* 我们来找一下里面的一些方法,我们来看一下sort方法,对于Object类型的数组进行排序* 他有这样的一个要求,All elements in the array must implements the Comparable interface.* 在这个数组里面所有的元素都必须去实现Comparable接口,这就是为什么你要去实现Comparable接口的原因* 所以我们写了半天这个内容,你会发现都是白写了,我们都没有必要写,JDK都已经帮我们实现了* 我写这些唯一的目的,就是要大家理解策略模式,要大家理解Comparable和Comparator接口* 不知道大家是否已经理解Comparable接口模式了,策略模式就是说当我比较大小的时候,我定义一个策略的比较器* 然后由具体的比较策略来决定我到底谁大谁小,封装一下商场的打折策略,如果你写了坦克的小游戏了,* 你必须封装一下坦克大炮弹的策略,现在商场有很多打折,什么周六打折,什么过年打折,什么两者加载一块打折,* 对于这种策略我们最好不要写死,因为将来还有很多策略还会产生,所以我们最好是把打折策略给他定义成扩展的内容* 这就是策略模式,坦克发射炮弹的策略,前提是你要听过坦克小游戏的开发,有的时候只打一发炮弹,有的时候是打多发炮弹,* 有时候可以打一个巨大型炮弹,具体由我发射炮弹的策略来决定,* */// dataSorter.sort(a);java.util.Arrays.sort(a);dataSorter.p(a);}
}

设计模式之_Strategy_06相关推荐

  1. 【Design pattern】设计模式思路总结(一)

    看了一周的设计模式,跟着小菜的思路走! 从简单工厂过渡策略,后面看的这几个模式都是在单一职责,开放--封闭原则,依赖倒转原则下不断的改进,采用模式写出的代码更容易扩展,维护! 比较容易懂. 装饰模式: ...

  2. GOF23设计模式(结构型模式)代理模式~

    代理模式应用场景十分广泛,随便一个框架都会用到,因此学好代理模式对后续框架学习是最基本的要素!!今天我们就来讲讲代理模式! 目录 1.简介 1. 核心作用 2. 角色分析 2. 应用场景 4. 分类 ...

  3. GOF23设计模式(创建型模式)工厂模式

    目录: 一:工厂模式的核心本质 二:关于面向对象的六大基本原则 三:工厂模式的三大类详解(代码示例,详细分析) 首先,上咱本GOF23所有工厂模式的分类表格!!! 创建型模式 单例模式.工厂模式.抽象 ...

  4. GOF23设计模式(创建型模式)单例模式

    目录: 一:单例模式的核心作用.常见应用场景 二:五种单例模式及其实现 三:关于反射和反序列化破解单例模式的漏洞,以及相应的解决方案 四:测试五种单例模式的效率 一:核心作用及常见应用场景: 核心作用 ...

  5. Python七大原则,24种设计模式

    七大设计原则: 1.单一职责原则[SINGLE RESPONSIBILITY PRINCIPLE]:一个类负责一项职责.  2.里氏替换原则[LISKOV SUBSTITUTION PRINCIPLE ...

  6. Java设计模式:单例模式

    学而时习,稳固而之心, 好久没有复习java的知识了,今天有空温习了单例模式,这里记录一下 单例模式是常见的设计模式的一种,其特点就是 指一个类只有一个实例,且该类能自行创建这个实例  , 保证一个类 ...

  7. 设计模式中的六大基本原则

    软件设计中的基本共识: 1,高内聚,低耦合:如果想使软件系统架构稳定,那么我们期望软件的各模块内元素结合的紧密,而模块之间的耦合度(关联性)越低越好.高内聚不仅体现在模块上,单独的类或方法也应该是内聚 ...

  8. JS中的7种设计模式

    第九章Refactoring to OOP Patterns 重构为OOP模式 7种设计模式: 1,模版方法模式(template method) 2,策略模式(strategy) 3,状态模式(st ...

  9. 设计模式之创建型汇总

    设计模式 创建型 工厂方法模式 定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行 使用场景: 创建对象需要大量重复的代码 客户端(应用层)不依 ...

最新文章

  1. 郑可迪 : 培养数据思维,投身电力大数据领域研究 | 提升之路系列(一)
  2. 洗礼灵魂,修炼python(85)-- 知识拾遗篇 —— 深度剖析让人幽怨的编码
  3. java使用Jsch实现远程操作linux服务器进行文件上传、下载,删除和显示目录信息...
  4. Can't pickle local object 'CDLL.__init__.locals._FuncPtr'
  5. 使用css实现点击切换效果
  6. flex module不编译的问题
  7. gsm,gprs,cmwap,cmnet,3g,TD-SCDMA,CDMA2000,WCDMA
  8. Socket的getInputStream()方法
  9. Oracle 9i DBA Fundamentals I学习笔记(六)
  10. DML 数据操纵语言
  11. bash脚本编程之条件判断、条件测试
  12. 选择IT行业的自我心得,希望能帮助到各位!(一)
  13. pythontiff怎么设置_在python中使用tiff文件
  14. vim command line quick edit
  15. 刨根系列之volatile详解 (二)
  16. 解析华为OSPF协议
  17. STM32之音乐播放器
  18. Linux——Linux账号与群组
  19. 扬州大学转专业计算机科学与技术,扬州大学级本科生转专业情况一览表.doc
  20. Mapabc里InfoWindow自定义窗口时的关闭事件。

热门文章

  1. 【转】visual studio 2012进行C语言开发[图文]
  2. modbus4-232 485 单机 多机
  3. 《论语》读后颜渊第十二主要大意
  4. 探讨Express Router Route
  5. LINQ根据某字段GroupBy
  6. 每天坚持不懈的写软文,得到的几点心得感悟
  7. ORACLE的sign函数和DECODE函数
  8. Android-- Intent.Action(2)
  9. visual c 语言参考手册pdf,Microsoft-Visual-C-6-0语言参考手册(三).pdf
  10. linux系统添加程序,Linux添加系统服务小程序