一、情况

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;
} @Override
public int compareTo(Teacher o) {
if(this.title > o.getTitle()){
return 1;
}else if(this.title == o.getTitle()){
return 0;
}else{
return -1;
}
} @Override
public 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;
} @Override
public String toString() {
return "student" +mark+" ";
} @Override
public 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); } }

  

测试结果

Java-马士兵设计模式学习笔记-策略模式-模拟Comparable接口的更多相关文章

  1. Java-马士兵设计模式学习笔记-策略模式-模拟 Comparator接口

    续上一篇  <Java 模拟 Comparable接口> 一.Teacher类及Student类的比较大小方式是不固定的,比如老师除了比较职称外,还可比较工龄大小,年龄大小等.则定义Com ...

  2. Java-马士兵设计模式学习笔记-工厂模式-模拟Spring读取Properties文件

    一.目标:读取properties文件,获得类名来生成对象 二.类 1.Movable.java public interface Movable { void run(); } 2.Car.java ...

  3. Java-马士兵设计模式学习笔记-命令模式

    一.概述 命令模式 二.代码 1.Client.java public class Client { public void request(Server server){ server.addCom ...

  4. Java-马士兵设计模式学习笔记-桥接模式

    一.概述 1.桥接模式的应用情况:(1)两个维度扩展(2)排列组合 二.代码 1.Gift.java public class Gift { protected GiftImpl giftImpl; ...

  5. Java-马士兵设计模式学习笔记-工厂模式-抽象工厂模式

    一.概述 1.抽象工厂:当情况是需要产生一系列产品,若需更换产品,则要求一系列产品一起换,且要控制一系列产品的产生过程,此时可考虑抽象工厂模式.例:小明装修屋子,把电视.冰箱都替换掉,他这次需要把电视 ...

  6. Java-马士兵设计模式学习笔记-工厂模式-简单工厂

    一.概述 1.目标:要控制任意类型交通工具的生产模式 2.目标有两层意思(1)任意类型 (2)生产模式,所以对应的,要这两个层面上抽象(Movable,VehicleFactory),利用接口,实现多 ...

  7. Java-马士兵设计模式学习笔记-迭代器模式-模仿Collectin ArrayList LinckedList

    Java Iterator模式 Java Iterator模式, 模仿Collectin ArrayList LinckedList 一.有如下几个类 1.接口Collection.java 2.接口 ...

  8. Java-马士兵设计模式学习笔记-代理模式-聚合与继承方式比较

    一.概述 1.目标:要在Tank的move()方法做时间代理及日志代理(可以设想以后还要增加很多代理处理),且代理间的顺序可活更换 2.思路: (1)聚合:代理类聚合了被代理类,且代理类及被代理类都实 ...

  9. Java-马士兵设计模式学习笔记-代理模式-动态代理 调用Proxy.newProxyInstance()

    一.概述 1.目标:不自己写代理类,利用Proxy.newProxyInstance()动态生成 2.用到的知识点: (1)//编译源码,生成class,注意编译环境要换成jdk才有compiler, ...

随机推荐

  1. spring MVC HandlerInterceptorAdapter

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...

  2. python 调试命令

    部分整理自:http://flysnowxf.iteye.com/blog/1327677 启动调试: python -m pdb xxx.py 常用命令说明: l #查看运行到哪行代码 n #单步运 ...

  3. [独孤九剑]Oracle知识点梳理(六)数据库常用对象之Procedure、function、Sequence

    本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...

  4. django的settings文件

    转载:http://www.cnblogs.com/likeshan168/articles/3596344.html

  5. 感知机学习算法Java实现

    感知机学习算法Java实现. Perceptron类用于实现感知机, 其中的perceptronOriginal()方法用于实现感知机学习算法的原始形式: perceptronAnother()方法用 ...

  6. WebForm中创建树节点TreeNode

    Tree: namespace ECTECH.NorthSJ.Web.SysData { public partial class testTree : BasePage { ; protected ...

  7. socket模型

    Socket: "主机" + "端口" = 套接字/插座; 仅仅是一个通信模型,不属于七层协议(网络协议). 一台电脑(IP)的一个应用程序(端口) 和 另一台 ...

  8. CentOS7 线上环境的一些 配置

    上周服务器被攻击导致上面收回了我们服务器的IP,所以这周重新安装部署了服务器,使用centos7系统.为了防止服务器再次被攻击,所以建议以下几点: 1. root密码要复杂一点,尽量字母数字特殊字符都 ...

  9. 基于windows平台的命令行软件安装工具Chocolatey的安装

    本文介绍Chocolatey的安装和使用 Chocolatey 这是基于.NET Framework 4以上的windows安装软件的命令行工具 安装 第一步,打开你的powershell.exe,使 ...

  10. 关于SQL结构化查询语言中(+)的用法

    一.概述 (+):从符号上理解为添加一些内容进入结果集中,那么自然会问到这么几个问题 1.添加什么内容 2.怎么添加 3.添加到什么结果集中 以下内容将以实例说明上面3个问题. 二.实例 以Oracl ...