策略模式:又叫算法簇模式,定义了不同的算法,并且可以相互替换,算法变化独立于客户端,针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式可以动态改变对象的行为,属于对象行为型模式。通常,策略模式适用于当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。
设计原则:把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口或者抽象类,然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。
策略模式组成:
1、抽象策略角色:策略类,通常由一个接口或者抽象类实现。
2、具体策略角色:包括了相关的算法和行为,可能不止一个具体策略角色。
3、环境角色:持有一个策略类的引用,最终给客户端调用的。
策略类(接口):
package Test201307;
public interface BaseStrategy {
void takeWay();
}
实现类:
package Test201307;
public class FootStrategy implements BaseStrategy{
@Override
public void takeWay() {
// TODO Auto-generated method stub
System.out.println("go on foot!");
}
}
package Test201307;
public class ShipBaseStrategy implements BaseStrategy{
@Override
public void takeWay() {
// TODO Auto-generated method stub
System.out.println("take a ship!");
}
}
package Test201307;
public class TrainBaseStrategy implements BaseStrategy{
@Override
public void takeWay() {
// TODO Auto-generated method stub
System.out.println("take a train!");
}
}
环境类:
package Test201307;
public class Context {
private BaseStrategy base;
public Context(BaseStrategy base){
this.base = base;
}
public BaseStrategy getBase() {
return base;
}
/**
* 调用接口算法、操作
*/
public void takeWay(){
this.base.takeWay();
}
}
测试类:
package Test201307;
public class Client {
public static void main(String[] args){
Context context =null;
//方式1: 步行
context = new Context(new FootStrategy());
context.takeWay();
// 方式2:火车
context = new Context(new TrainBaseStrategy());
context.takeWay();
// 方式3:船
context = new Context(new ShipBaseStrategy());
context.takeWay();
}
}