- 浏览: 38128 次
- 性别:
- 来自: 北京
文章分类
最新评论
使用策略模式(Strategy)实现多关键字排序
“策略模式”的出现,是为了提供一套相互之间可灵活替换的算法,在不影响上层接口的情况下,用户可以自由选择不同的算法完成逻辑。
策略模式的UML示意图如下:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype>
该项目是一个小型的商业网站,逻辑层由Servlet实现。用户有一个需求,需要从数据库调出商品信息后能够对记录按名称(name)、规格(standard)、价格(price)和注册日期(register date)进行排序。虽然可以考虑按不同的排序关键字使用不同的sql语句(即不同的order by)查询数据库。但这样做的网络数据流量太大,每次需要从数据库完整地取回一个数据集(ResultSet),所以我选择了将数据集一次取到客户端的一个List中,然后在客户端按不同的关键字对List进行排序。
java.util.Collections类中有一个public static void sort(List list, Comparator comparator)的方法,可以按照不同的Comparator对象对list进行排序,它使用的是快速排序,所以效率非常高。而java.util.Comparator是一个接口:
public abstract interface Comparator {
boolean equals(Object object);
int compare(Object object, Object object1);
}
其中和排序有关的是compare方法,它返回一个整数,若第一个参数比第二个参数“大”,则返回一个正数,若“小”则返回一个负数,若“相等”则返回0,这里的“大”、“小”、“相等”是由compare方法具体实现定义的一种比较标准。由这个方法不禁想到C语言中qsort函数中使用的函数指针int *compare(*,*),JAVA中之所以没有函数指针,就是用接口取代了(更详细的介绍见《Effective Java》中第22条“用类和接口来代替函数指针”)。
很明显,Comparator接口就是我们的“抽象策略”,sort方法就是我们的“消费API”,而不同的“具象策略”就是我们从Comparator接口实现的根据不同关键字排序的类。
整个排序模型的UML图如下,其中为了作图方便,我从Comparator继承了一个接口ItemComparator,根据不同的关键字从ItemComparator接口泛化了NameComparator类,PriceComparator类,RegisterDateComparator类和StandardComparator类。实际运用中不需要这个接口,四个类可以直接从Comparator泛化。ItemBean是一个封装了商品信息的bean,List中存放的就是这些bean。ItemSort和ItemComparator以及四个具体类实现了“简单工厂”模式,并封装了sort方法。
下面是具体的代码(
NameComparator类:
public class NameComparator implements ItemComparator{
NameComparator(){} // 将构造器封装,包外的类欲得到Comparator实例只能通过简单工厂
public int compare(Object o1,Object o2){
String name1=((ItemBean)o1).getName();
String name2=((ItemBean)o2).getName();
return name1.compareTo(name2); // 调用String的CompareTo方法
}
}
PriceComparator类
public class PriceComparator implements ItemComparator{
PriceComparator(){}
public int compare(Object o1,Object o2){
Double price1=new Double(((ItemBean)o1).getPrice());
Double price2=new Double(((ItemBean)o2).getPrice());
return price1.compareTo(price2); // 调用Double的CompareTo方法
}
}
RegisterDateComparator类
import java.util.*;
public class RegisterDateComparator implements ItemComparator{
RegisterDateComparator(){}
public int compare(Object o1,Object o2){
Date date1=((ItemBean)o1).getRegisterDate();
Date date2=((ItemBean)o2).getRegisterDate();
return date1.compareTo(date2); // 调用Date的CompareTo方法
}
}
ItemSort类
import java.util.*;
public class ItemSort{
public static List sort(List items,ItemComparator c){
Collections.sort(items,c);
return items;
}
public static final ItemComparator NAME=new NameComparator(); // 简单工厂
public static final ItemComparator PRICE=new PriceComparator();
public static final ItemComparator STANDARD=new StandardComparator();
public static final ItemComparator REG_DATE=new RegisterDateComparator();
}
TestItemSort类
import java.util.*;
public class TestItemSort{
public static void main(String[] args){
List items=new ArrayList();
// 向List添加条目
items=ItemSort.sort(items,ItemSort.NAME); // 按名称排序
items=ItemSort.sort(items,ItemSort.PRICE); // 按价格排序
items=ItemSort.sort(items,ItemSort.REG_DATE); // 按注册日期排序
items=ItemSort.sort(items,ItemSort.STANDARD); // 按规格排序
}
}
发表评论
-
在Java中使用Oracle blob
2005-02-13 22:27 745Oracle中的lob (Large Object)可以存储非 ... -
java.util.StringTokenization
2005-02-13 22:29 617今天室友老七做数据库大作业,其中要实现一个功能,就是输入一个以 ... -
JBuilder 2005中的Servlet mapping
2005-02-13 22:30 675使用JB进行Servlet好像很方便的样子,但是servlet ... -
static与final变量
2005-08-04 12:27 720一、illegal forward refrence 前天写一 ... -
Alloy
2005-08-04 13:09 623Alloy look and feel(http:// ... -
IDEA
2005-08-04 13:11 891今天在TSS上看到IntelliJ的IDEA 5.0终于rel ... -
原型模式(Prototype)
2005-08-05 10:54 722一、概述 原型模式属于对象创建模式,通过给出一个原型对象来指明 ... -
IDEA破解过程
2005-08-05 19:11 1776开场白就不说了,直接切入正题吧。本破解的前提是安装了IDEA ... -
适配器模式(Adapter)
2005-08-06 19:39 594一、概述 类的适配器模式把被适配的类的API转换成为目标类的A ... -
A beginners guide to Dependency Injection [转载自TSS]
2005-08-08 22:30 803Scope This article presents a h ... -
Alloy破解过程
2005-08-09 15:42 8351package com.incors.plaf. ... -
接口与Object类的关系?
2005-08-19 13:53 1082今天凌晨coding的时候发现一个很有趣的现象。“Object ... -
缺省适配器模式(Default Adapter)
2005-09-06 12:01 754一、概述 当不需要全部实现适配器接口提供的方法时,可先设计一个 ... -
Object Modeling Strategies (I)
2005-09-08 10:12 573Activities and model components ... -
Joshua Bloch咏Tiger诗八首
2005-09-08 16:59 812“Ease of Development”是J2SE 1.5的 ... -
James Gosling
2005-09-14 22:01 754今天是Java China 2005的最后一天,下午没有去各个 ... -
Object Modeling Strategies (II)
2005-09-19 15:23 602Str#1d. "Invest an Hour&qu ... -
Object Modeling Strategies (III)
2005-09-19 15:26 542Identifying system purpose and ... -
Tomcat 5.5.9 不支持switch(<enum>)?
2005-09-19 18:51 783ServiceExceptionType: package p ... -
“软件危机”时总结的坏的编程习惯——我们是否依旧守着古风?
2005-10-09 14:23 7061、乱用GOTO语句(上下跳转看起来非常方便) 2、大量使用 ...
相关推荐
【Java设计模式】(2)策略模式Strategy
C#面向对象设计模式 (行为型模式) Strategy 策略模式 视频讲座下载
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。...
走进设计模式之 策略模式(Strategy) 代码
设计模式C++学习之策略模式(Strategy)
2009-03-9 策略模式Strategy:当解决一个问题的途径(策略)有很多种的时候,每一种处理方式都可以做为一种处理策略,通过管理类来切换调用不同的策略。
设计模式 策略模式。金典模式之策略模式代码。
微信小程序--使用策略模式进行表单验证strategy-master.zip
设计模式-策略模式(Strategy)结合Android小知识讲解,简单明了
strategy策略模式源码 策略模式源码 策略模式源码 策略模式源码
strategy(策略模式Java代码实现)
策略模式让算法独立于使用它的客户而独立变化。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary ...
这种设计模式比较常用,希望能够帮助到大家。
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第23节:行为型模式Strategy策略模式
C#面向对象设计模式纵横谈(23):(行为型模式) Strategy 策略模式
在策略模式(Strategy Pattern)中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
一个把数组导出为表格的算法,输入一个数组,导出一个表格,当用户想改变导出的表格时,便可以通过改变输出的算法改变输出的结果。如果输出的内容用以网页显示,则输出 <table><tr><td>Jack</td></tr><tr><td>Maya...
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。
使用Java实现不同排序算法的策略模式的代码。
这份文档讲诉了设计模式之策略(Strategy)模式,希望可以帮助学习的人!