策略模式(Strategy Pattern)
两个基本原则:1.封装变化的概念。2.编程中使用接口类型。
定义:定义一组算法,讲每个算法封装起来,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。
策略模式的组成:
1. 抽象策略角色:策略类,通常由一个接口或抽象类实现。
2. 具体策略角色:包装了相关的算法和行为类。
3. 环境角色:特有一个策略类(抽象引用实现公共接口)的引用,最终给客户端调用的。
策略模式的编写步骤
1. 对策略对象定义一个公共接口。
2. 编写策略类,该类实现了上面的公共接口。
3. 在使用策略对象的类中保存一个策略对象的引用。
4. 在使用策略对象的类中,实现对策略对象的set和get方法,或者使用构造器完成赋值。
策略模式的实现:
1. 策略模式的用意是针对一组算法,将每一个算法封装到具有相同接口的独立的类中,从而使得它们可以相互替换。
2. 策略模式使得算法可以在不影响到客户端的情况下发生变化。使用策略模式可以把行为和环境分割开来。
3. 环境类负责维护和查询行为类,各种算法则在具体策略中提供。由于算法和环境独立开来,算法的修改都不会影响环境和客户端。
以下提供个实例:假如有若干个类Person对象存在一个List当中,对他们进行排序,分别按照名字、年龄、ID进行排序(要有正序与倒序两种排序方式)。假如年龄和名字重复,按照ID的正序进行排序。(要求只用策略模式进行)
一、对策略对象定义个一个接口:
packagestrategy;
importjava.util.*;
publicinterface Strategy
{
void sort(List<Person> list);
}
二、编写具体策略类实现上面的公共接口(封装方法,这里只列举2个):
实现Name升序排列:
package strategy;
import java.util.*;
class UpNameSort implements Strategy , Comparator<Person>
{
publicvoid sort(List<Person> list)
{
Collections.sort(list,this);
}
publicint compare(Person p1 , Person p2)
{
intresult = p1.getName().compareTo(p2.getName());
if(result==0 )
{//返回负,正序
returnp1.getId() - p2.getId();
}
returnresult;
}
}
实现Name倒序排列:
package strategy;
import java.util.*;
class DownNameSort implements Strategy ,Comparator<Person>
{
publicvoid sort(List<Person> list)
{
Collections.sort(list,this);
}
publicint compare(Person p1, Person p2)
{
intresult = p2.getName().compareTo(p1.getName());
if(result==0 )
{
returnp1.getId() - p2.getId();
}
returnresult;
}
}
三、创建环境类(Environment)
在环境类中定义策略类(接口引用)的引用。并通过construction或者set方法传入实例对象。通过实例对象确定当前调用的sort()方法的具体操作。通过这个策略引用来调用相应功能的方法。(这里实现方法与环境分离)
package strategy;
import java.util.*;
class Environment
{
privateStrategy strategy;
publicEnvironment(Strategy strategy)
{
this.strategy= strategy;
}
publicEnvironment(){}
//构造传值或者set()传值都可以。
publicvoid setStrategy(Strategy strategy)
{
this.strategy= strategy;
}
publicvoid sort(List<Person> list)
{
this.strategy.sort(list);
}
}
四、客户端类(Client)。
List<Person> list = newLinkedList<Person>();
Environment env = new Environment();
env.setStrategy(newUpNameSort());
env.sort(list);
for(inti = 0; i < list.size(); i++)
{
Personp = list.get(i);
System.out.println("Id:" + p.getId() + ", Name: " + p.getName() + ", Age: " +p.getAge());
}
env.setStrategy(newDownNameSort());
env.sort(list);
System.out.println("----------------------");
for(inti = 0; i < list.size(); i++)
{
Personp = list.get(i);
System.out.println("Id:" + p.getId() + ", Name: " + p.getName() + ", Age: " +p.getAge());
}
这里只是部分Code,如有需要QQ联系。