java设计模式学习笔记2 策略模式

来源:互联网 发布:专业手机维修软件 编辑:程序博客网 时间:2024/06/01 09:08

策略模式也是java中用的比较多的一种编程模式,如TreeMap和TreeSet中的比较器,就是使用的策略模式。

策略模式把变化的概念进行了封装,编程的时候提供接口,而不管具体实现。


一般有3个角色1)抽象策略角色(通常由一个接口或者抽象类组成)

                           2)具体策略角色:implements抽象策略角色,包装相关算法和具体行为

                           3)环境角色:就像TreeSet(比较器)与TreeMap(比较器),给策略角色提供了使用环境,持有一个抽象策略角色的引用

编写策略模式,也可以参照上面的顺序。

下面是安装网上教程学习时候编写的一个应用策略模式的一个小demo。用于按照名字顺序给List中的元素进行排序,如果名字一样则按照id排序。

1)先定义一个抽象策略角色Sort,用接口实现其中使用的person类见末尾

package com.charleszhu.test;import java.util.List;public interface Sort {public void sort(List<Person> list);}

2 )编写以空格具体策略角色,实现这个抽象策略模式接口,同时实现比较器接口

package com.charleszhu.test;import java.util.Collections;import java.util.Comparator;import java.util.List;public class UpByName implements Sort, Comparator<Person> {public void sort(List<Person> list) {// TODO Auto-generated method stubCollections.sort(list, this);}public int compare(Person o1, Person o2) {int result = o1.getName().compareTo(o2.getName());if(0==result){return o1.getId()-o2.getId();}return result;}}

3)编写一个环境类environment,包含一个抽象策略模式Sort的引用:

package com.charleszhu.test;import java.util.List;public class Evrionment {public static void listSort(List<Person> list,Sort s){s.sort(list);}}
4)  编写一个测试用例Client

public class Client {public static void main(String[] args) {Person p1 = new Person(1,"charles1",22);Person p2 = new Person(2,"charles5",22);Person p3 = new Person(4,"charles5",22);Person p4 = new Person(3,"charles3",22);Person p5 = new Person(5,"charles2",22);List<Person> list = new ArrayList<Person>();list.add(p1);list.add(p2);list.add(p3);list.add(p4);list.add(p5);Evrionment.listSort(list, new UpByName());for (Iterator<Person> iterator = list.iterator(); iterator.hasNext();) {Person p= iterator.next();System.out.println(p.getId()+" "+p.getName());} }}

输出结果如下:

1 charles1
5 charles2
3 charles3
2 charles5
4 charles5

此处使用的Collections包含了许多和集合相关的静态方法可以直接调用。与Arrays类似,但后者都是关于数组的相关静态方法。

其中使用了一个自定义的类Person

package com.charleszhu.test;public class Person {private int id;private String name;private int age;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 int getAge() {return age;}public void setAge(int age) {this.age = age;}public Person(int id, String name, int age) {super();this.id = id;this.name = name;this.age = age;}public Person() {}}



0 0
原创粉丝点击