策略模式

策略模式的角色

 

  • 抽象策略角色
  • 具体策略角色
  • 环境角色

在jdk中,Comparator就是一种典型的策略模式,其中,Comparator就是抽象的策略角色,自定义一个类并实现Comparator就叫做具体策略角色,使用自定义的类对TreeSet进行排序,那么这个TreeSet就是环境角色

 

例:有一个Person类,放在一个列表中,要分别按id升序和降序排列,要求使用策略模式

1、Person类

public class Person
{
	private int id;
	private String name;
	public int getId()
	{
		return id;
	}
	public void setId(int id)
	{
		this.id = id;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	
	public Person(int id,String name)
	{
		this.id=id;
		this.name=name;
	}
	
	public String toString()
	{
		return "id="+id+" name="+name;
	}
}


2、定义抽象策略(Comparator 注意这是我定义的,并非jdk自带的那个Comparator)

public interface Comparator<T>
{
	public List<T> sort(List<T> list);
}


3、定义具体策略(AscComparator,DescComparator 分别实现Comparator)

public class AscComparator implements Comparator<Person>
{

	@Override
	public List<Person> sort(List<Person> list)
	{
		
		Person[] persons=list.toArray(new Person[1]);
		
		for(int i=0;i<persons.length-1;i++)
		{
			for(int j=0;j<persons.length-i-1;j++)
			{
				if(persons[j].getId()>persons[j+1].getId())
				{
					Person temp=persons[j];
					persons[j]=persons[j+1];
					persons[j+1]=temp;
				}
			}
		}
		list=Arrays.asList(persons);
		return list;
	}
}

public class DescComparator implements Comparator<Person>
{
	@Override
	public List<Person> sort(List<Person> list)
	{
		Person[] persons=list.toArray(new Person[1]);
		
		for(int i=0;i<persons.length-1;i++)
		{
			for(int j=0;j<persons.length-i-1;j++)
			{
				if(persons[j].getId()<persons[j+1].getId())
				{
					Person temp=persons[j];
					persons[j]=persons[j+1];
					persons[j+1]=temp;
				}
			}
		}
		list=Arrays.asList(persons);
		return list;
		
	}
}


4、环境角色

public class Collections
{
	private Comparator compare=null;
	
	public Comparator getCompare()
	{
		return compare;
	}
	public void setCompare(Comparator compare)
	{
		this.compare = compare;
	}
	public List<Person> sort(List<Person> list)
	{
		return compare.sort(list);
	}
}


5、测试

public class Test
{
	public static void main(String[] args)
	{
		Person p1=new Person(1,"gavin");
		Person p2=new Person(2,"aviva");
		Person p3=new Person(3,"tom");
		Person p4=new Person(4,"jack");
		List<Person> person=new ArrayList<Person>();
		
		person.add(p2);
		person.add(p4);
		person.add(p1);
		person.add(p3);
		
		Collections col=new Collections();
		//升序排序
		col.setCompare(new AscComparator());
		person=col.sort(person);
		System.out.println(person);
		System.out.println("-----------------------");
		//降序排序
		col.setCompare(new DescComparator());
		person=col.sort(person);
		System.out.println(person);
		
	}
}


6、总结

在以上的例子中,当我们想改变排序方式时,并不需要改变Collections这个类,只需要按照自己的需要些一个具体策略角色放置到Collections中即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值