`
zhengjiong
  • 浏览: 71388 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

使用策略模式让集合自定义排序

    博客分类:
  • Java
阅读更多

 

package com.zj.exercise2;

import java.util.List;

/**
 * 功能:抽象策略角色
 * @author zhengjiong
 * time:2011-9-16 00:02:12
 */
public interface Strategy
{
	public void sort(List<Person> list);
	
}

 

 

import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 功能:定义一个具体的策略角色(Strategy),也是一个比较器(Comparator),按username的升序排列
 * @author zhengjiong
 * time:2011-9-16 上午12:02:56
 */
public class StrategyByUsername	implements Strategy, Comparator
{

	@Override
	public void sort(List<Person> list)
	{
		Collections.sort(list, this);
	}

	/**
	 * 按照username的升序排列,如果username一样则按照id的升序排列
	 */
	@Override
	public int compare(Object o1, Object o2)
	{
		Person p1 = (Person)o1;
		Person p2 = (Person)o2;
		
		//如果姓名一样则按照id升序排列
		if(p1.getUsername().equals(p2.getUsername()))
		{
			return p1.getId() - p2.getId();
		}
		//按照username升序排列
		return p1.getUsername().compareTo(p2.getUsername());
	}
}

 

import java.util.List;

/**
 * 功能:策略模式的环境角色
 * @author zhengjiong
 * time:2011-9-16 上午01:08:40
 */
public class Environment
{
	private Strategy strategy;
	
	public Environment(Strategy strategy)
	{
		this.strategy = strategy;
	}
	
	public void sort(List list)
	{
		strategy.sort(list);
	}
	
	public void setStrategy(Strategy strategy)
	{
		this.strategy = strategy;
	}

	public Strategy getStrategy()
	{
		return strategy;
	}
}

 package com.zj.exercise2;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/**
 * 功能:使用策略模式让集合排序
 * @author zhengjiong
 * time:2011-9-16 上午01:10:49
 */
public class Client
{
	public static void main(String[] args)
	{	
		Person p1 = new Person(1, "e", 16);
		Person p2 = new Person(5, "a", 15);
		Person p3 = new Person(4, "c", 20);
		Person p4 = new Person(2, "b", 23);
		Person p5 = new Person(3, "f", 18);
		Person p6 = new Person(6, "a", 18);
		Person p7 = new Person(8, "y", 20);
		Person p8 = new Person(7, "x", 16);
		Person p9 = new Person(9, "b", 25);
		Person p10 = new Person(10, "h", 19);
		
		
		List<Person> list = new LinkedList<Person>();
		list.add(p1);
		list.add(p2);
		list.add(p3);
		list.add(p4);
		list.add(p5);
		list.add(p6);
		list.add(p7);
		list.add(p8);
		list.add(p9);
		list.add(p10);
		
		for(Iterator i = list.iterator(); i.hasNext();)
		{
			Person person = (Person)i.next();
			System.out.println(person);
		}
		System.out.println();
		System.out.println("------------id升序------------");
		
		//实例化具体的策略模式
		StrategyById sbi = new StrategyById();
		
		//实例化环境角色,使用id升序排列
		Environment env = new Environment(sbi);
		
		env.sort(list);
		
		for(Iterator i = list.iterator(); i.hasNext();)
		{
			Person person = (Person)i.next();
			System.out.println(person);
		}
		
		System.out.println();
		System.out.println("------------id降序------------");
		//实例化具体的策略模式
		StrategyByIdDESC sbidesc = new StrategyByIdDESC();
		//设置为降序模式
		env.setStrategy(sbidesc);
		env.sort(list);
		for(Iterator i = list.iterator(); i.hasNext();)
		{
			Person person = (Person)i.next();
			System.out.println(person);
		}
		
		System.out.println();
		System.out.println("------------username升序,如果名字一样按照id升序排列------------");
		//实例化具体的策略模式
		StrategyByUsername sbu = new StrategyByUsername();
		//设置为降序模式
		env.setStrategy(sbu);
		env.sort(list);
		for(Iterator i = list.iterator(); i.hasNext();)
		{
			Person person = (Person)i.next();
			System.out.println(person);
		}
		
		System.out.println();
		System.out.println("------------username降序,如果名字一样按照id升序排列------------");
		//实例化具体的策略模式
		StratigyByUsernameDESC sbdesc = new StratigyByUsernameDESC();
		//设置为降序模式
		env.setStrategy(sbdesc);
		env.sort(list);
		for(Iterator i = list.iterator(); i.hasNext();)
		{
			Person person = (Person)i.next();
			System.out.println(person);
		}
		
	}
}
 
分享到:
评论

相关推荐

    JAVA学习——集合与三层设计模式

    在Java编程语言中,集合和三层设计模式是两个非常重要的概念,对于开发高效、可维护的软件系统至关重要。本文将详细探讨这两个主题。 首先,我们来了解Java中的集合。Java集合框架是Java SE API的一个核心部分,它...

    iOS策略模式

    4. **排序算法**:在处理数组或集合时,可能会有多种排序需求,如升序、降序、自定义排序等。可以为每种排序方式创建一个策略,上下文根据需要选择合适的策略进行排序。 5. **支付方式**:在线购物应用可能支持多种...

    SortListView按字母排序改进版

    - 如果需要支持多种排序方式(如正序、反序或自定义排序),可以设置不同的排序标志,并在触发排序时根据标志选择相应的比较器。 8. **用户反馈与UI设计**: - 显示当前的排序状态,如一个指示当前排序方式的图标...

    C#ListView自定义控件(重绘)代码+说明文档

    在.NET Framework中,C#的ListView控件是用于显示数据集合的一种常见组件,它提供了多种视图模式,如图标、列表、小图标等。然而,对于一些特定的UI设计需求,ListView控件的原生功能可能显得较为局限,特别是在...

    Java企业设计模式

    在Java中,策略模式常用于实现动态策略选择,比如排序算法的切换。 14. 模板方法模式:模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。它使子类可以在不改变算法结构的情况下,重新定义算法的...

    面向对象java排序包

    然后,通过继承这个基类或实现相关的接口,如`Comparator`,可以创建不同的排序策略,如快速排序、归并排序、冒泡排序等。 【继承接口】是Java中实现多态性和扩展功能的关键手段。在这个排序包中,可能定义了一个或...

    迭代器模式简介和java代码实现

    在实际开发中,迭代器模式不仅限于简单的元素遍历,还可以结合其他设计模式,如装饰器模式、策略模式等,以实现更复杂的操作,如过滤、排序等。总之,迭代器模式是一种强大的工具,可以帮助我们更好地管理和遍历集合...

    java集合源码、设计模式、常用算法、Mysql原理.zip

    5. **策略模式**:定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换,让算法独立于使用它的客户。 在算法方面,Java程序员应熟悉一些基础和高级算法,如: 1. **排序算法**:快速排序、归并排序、...

    4对象集合项目源码.rar

    5. **集合的排序和比较**:可能涉及到IComparable和IComparer接口,用于自定义对象的比较规则,实现集合的排序。 6. **集合的性能优化**:可能包括对内存管理、性能测试和优化的讨论,如使用WeakReference减少内存...

    超级列表框数据库排序

    可以采用缓存策略,只在必要时才从数据库加载数据,或者使用分页技术来减少一次性加载的数据量。 8. **标签"tag"的应用**:在编程中,"tag"经常被用作附加信息,比如在ListView项中存储数据库中的ID或其他与该项...

    DataList分页与排序Repeater分页

    在.NET开发环境中,DataList和Repeater是两种常用的控件,用于显示数据集合。它们都是数据绑定控件,但各自有其特点和适用场景。在处理大量数据时,分页和排序功能是必不可少的,以优化用户体验并提高系统性能。本篇...

    详解Java编程中的策略模式

    在实际应用中,策略模式的一个经典例子是在Java集合框架中,如 `Map` 和 `Set` 的构造函数中传入 `Comparator` 对象,或者在 `Collections.sort()` 方法中使用自定义比较器。例如,在提供的代码片段中,`...

    给jdk写注释系列之jdk1.6容器(9)Strategy

    同时,对于`Comparable`接口的理解有助于理解如何在Java集合框架中实现自定义排序,这对于开发高效的数据结构和算法至关重要。这份教程是Java开发者,尤其是那些正在使用或升级到JDK 1.6的开发者的重要参考资料。

    ios设计模式开发23种设计模式OC编程

    21. **策略模式**:定义一系列算法,并将每一个算法封装起来,使它们可以互相替换。在iOS中,常用于提供多种策略选择,如排序算法。 22. **模板方法模式**:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。...

    JAVA集合类应用[借鉴].pdf

    Java集合类是Java编程语言中用于存储和管理对象的核心组件,位于`java.util`包中...在实际编程中,开发者还应该关注集合类的容量策略、迭代器的使用以及如何有效地利用各种集合类提供的方法来提高代码的效率和可读性。

    java性能优化方法

    同时,避免过度使用if-else结构,可以考虑使用switch语句、三元运算符或者策略模式,以提高代码的可读性和维护性。 通过以上分析,我们可以看到Java性能优化不仅涉及到集合操作和反射机制的巧妙运用,还涵盖了对象...

    商业源码-编程源码-GridView自定义控件源码.zip

    5. **性能优化**:在大数据集的情况下,自定义控件可能会优化数据加载策略,例如分页加载,只在需要时加载部分数据,从而提高应用性能。 6. **用户体验**:自定义控件还可以改善用户体验,如添加动画效果、触摸友好...

    JAVA设计文本文件读取倒序排序

    8. **设计模式**:虽然未明确提及,但良好的程序设计可能采用了某种设计模式,如命令模式(将文件操作封装为命令对象)或策略模式(将排序策略作为可替换的组件)。 这个项目是一个典型的Java GUI应用实例,它结合...

    Android实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音

    - 在Java中,我们可以使用Collections.sort()方法对List类型的集合进行排序,但这个方法不支持按特定规则(如A-Z)排序。所以我们需要自定义Comparator,比较对象中的字段(通常是字符串),根据其首字母的字符顺序...

    带箭头排序的ListView示例

    ASP.NET的ListView是用于显示数据集合的强大控件,它可以灵活地自定义布局和样式,支持多种数据绑定模式,如数据源控件绑定或编程方式绑定。ListView的优势在于其高度的模板化,开发者可以通过定义ItemTemplate、...

Global site tag (gtag.js) - Google Analytics