一、情况

1.目标:要在专门用于排序数据的DataSorter.java中实现对所有A类,B类,C类,D类等等的排序

2.初步想法:DataSorter.java的代码如下

public class DataSorter {public static void sort(A a){}public static void sort(B a){}public static void sort(C c){}//...................
}

  

3.这样会造成DataSorter的可扩展性差,要支持对新类的排序时,要修改代码。更好的思路是:既然DataSorter是要根据不同的类的采取不同的方法实现排序,那么具体实现排序的方法交由子类去实现,且都实现同一个接口Comparable,那么DataSorter只需对Comparable排序,而无需理会具体要排序的是什么类(多态)

4.有如下几个类:

(1)DataSorter.java

(2)接口Comparable.java

(3)Student.java

(4)Teacher.java

(5)Test.java

5.代码如下:

(1)DataSorter.java

public class DataSorter {public static void sort(Comparable [] a) {int index;                            //保存每次比较,最大值的下标;for(int i = 1; i < a.length; i++){    //控制外循环次数index = 0;for(int j = 1; j <= a.length - i ; j++){if(a[j].compareTo(a[index]) == 1){index = j;}}swap(a, index, a.length -i);}}private static void swap(Comparable[] a, int x, int y) {Comparable tmp = a[x];a[x] = a[y];a[y] = tmp;}//输出数组元素public static void show(Comparable[] a) {for(int i = 0; i < a.length; i++){System.out.println(a[i]);}}}

  

(2)Comparable.java

public interface Comparable<T> {public int compareTo(T o);
}

  

(3)Teacher.java

public class Teacher implements Comparable<Teacher> {private int title;public Teacher(int title) {super();this.title = title;}public int getTitle() {return title;}public void setTitle(int title) {this.title = title;}@Overridepublic int compareTo(Teacher o) {if(this.title > o.getTitle()){return 1;}else if(this.title == o.getTitle()){return 0;}else{return -1;}}@Overridepublic String toString() {return "teacher--" +title+" ";}
}

  

(4)Student.java

public class Student implements Comparable<Student> {private int mark;public int getMark() {return mark;}public void setMark(int mark) {this.mark = mark;}public Student(int mark) {super();this.mark = mark;}@Overridepublic String toString() {return "student" +mark+" ";}@Overridepublic int compareTo(Student o) {if(this.mark > o.getMark()){return 1;}else if(this.mark == o.getMark()){return 0;}else{return -1;}}
}

  

(5)Test.java

public class Test {public static void main(String[] args) {//int [] a = {9,2,1,8,0,3};Student [] ss = {new Student(59),new Student(30),new Student(90)};DataSorter.sort(ss);DataSorter.show(ss);Teacher [] ts = {new Teacher(10),new Teacher(3),new Teacher(12)};DataSorter.sort(ts);DataSorter.show(ts);}}

  

测试结果

转载于:https://www.cnblogs.com/shamgod/p/4585488.html

Java-马士兵设计模式学习笔记-策略模式-模拟Comparable接口相关推荐

  1. [设计模式学习笔记] -- 策略模式

    策略模式 定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 举一个简单的例子来描述策略模式. 设计一款冷兵器时代士兵打仗的游戏,游戏内部设计要使用OO技术. ...

  2. 设计模式学习笔记——策略(Strategy)模式

    设计模式学习笔记--策略(Strategy)模式 @(设计模式)[设计模式, 策略模式, Stategy] 设计模式学习笔记策略Strategy模式 基本介绍 策略案例 类图 实现代码 Hand类 S ...

  3. 马士兵Hibernate学习笔记

    马士兵hibernate学习笔记 课程内容 6课程内容 1 HelloWorld 6 2 Hibernate原理模拟-什么是O/R Mapping以及为什么要有O/R Mapping 6 3 常见的0 ...

  4. 设计模式 - 学习笔记 - 工厂模式Factory Pattern

    设计模式 - 学习笔记 - 工厂模式Factory Pattern 1. 简单工厂 1.1 应用场景 1.2 UML 1.3 优劣分析 好处 缺点 1.4 代码示例 抽象产品 AbstractProd ...

  5. Java:Effective java学习笔记之 考虑实现Comparable 接口

    Java 考虑实现Comparable 接口 考虑实现Comparable 接口 1.Comparable接口 2.为什么要考虑实现Comparable接口 3.compareTo 方法的通用约定 4 ...

  6. Java进阶篇设计模式之十一 ---- 策略模式和模板方法模式

    前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...

  7. 设计模式学习:策略模式

    策略模式简介 策略模式:策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口 和 具体行为的实现.策略模式最大的特点是行为的变化,行为之间可以相互替换.每个if判断都可以理解为就是 ...

  8. Head First设计模式读书笔记——策略模式

    问题描述: 目前的任务是实现一个FPS类游戏的各种角色(友军.敌军.平民和狗.猫.鸭子等动物)以及他们的各种行为(攻击.游泳等). 设计方案一 很简单,只要实现一个角色超类,将角色的各种行为放入超类中 ...

  9. 设计模式学习笔记——外观模式

    外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这种模式涉及 ...

最新文章

  1. Gradle学习之基础篇
  2. 开源APM技术选型与实战
  3. WRF用户手册翻译:Chapter 5: WRF Model
  4. HBuilder X全局文件搜索和文件字符搜索快捷键
  5. CGI模式,模块模式与CLI模式运行PHP的区别
  6. java地狱猫_ES6 ES6变量的声明
  7. 动态调用对象的属性和方法——性能和灵活性兼备的方法
  8. mysql查询含有某个值的表_MYSQL查询数据表中某个字段包含某个数值
  9. 我来重新学习js的面向对象(part 4)
  10. 个人品牌这个事情,适用于长期主义者
  11. 导出excel 文件
  12. [bzoj1008][HNOI2008]越狱-题解[简单组合数学]
  13. ASP.NET Core部署在IIS上
  14. Java 就业培训教程 第二章读书笔记啊
  15. shell脚本:介绍、语法、运算、流程控制、对文件/输出流处理、案例
  16. access函数使用方法
  17. 疫情影响下普惠金融风险与对策
  18. 小程序 设置小程序打开聊天中的素材
  19. NodeJS充分利用多核CPU以及它的稳定性
  20. 阿拉伯数字转化为大写汉字

热门文章

  1. 计算机组成原理—虚拟存储器的基本概念
  2. RayMarching2:给球加上光照
  3. bzoj 1671: [Usaco2005 Dec]Knights of Ni 骑士(BFS)
  4. 图像识别讲解 以一个简单的图像识别任务为例
  5. C++新手入门学习笔记(跟着敲)
  6. [GCN] 增加可视化+代码注释 of GitHub项目:Graph Convolutional Networks in PyTorch
  7. jQuery Mobile中主题theme样式a-z
  8. 不同操作系统下重置root密码的方法
  9. pyspark对应的scala代码PythonRDD对象
  10. 了解Java密码扩展的基础