策略模式
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。例如:出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等,超市促销可以釆用打折、送商品、送积分等方法。
意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决:将这些算法封装成一个一个的类,任意地替换。
关键代码:实现同一个接口。
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。
使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
策略模式的主要角色如下:
1.抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
2.具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
3.环境(context)类:持有一个策略类的引用,最终给客户端调用。
其结构图如图所示:
实现:
/**
*
* @ClassName: MethodOfTravel
* @Description: 定义抽象旅行方式
* @author: ljx
* @date: 2019年4月11日 上午10:56:56
*/
public interface MethodOfTravel {
public void Method();
}
/**
*
* @ClassName: airplane
* @Description: 坐飞机
* @author: ljx
* @date: 2019年4月11日 上午10:58:43
*/
public class Airplane implements MethodOfTravel {
@Override
public void Method() {
System.out.println("选择坐飞机的方式旅游");
}
}
/**
*
* @ClassName: Train
* @Description: 坐火车
* @author: ljx
* @date: 2019年4月11日 上午11:07:29
*/
public class Train implements MethodOfTravel {
@Override
public void Method() {
System.out.println("选择坐火车的方式旅游");
}
}
/**
*
* @ClassName: TravelContext
* @Description: 环境类
* @author: ljx
* @date: 2019年4月11日 上午11:08:23
*/
public class TravelContext {
private MethodOfTravel methodOfTravel;
public MethodOfTravel getMethodOfTravel() {
return methodOfTravel;
}
public void setMethodOfTravel(MethodOfTravel methodOfTravel) {
this.methodOfTravel = methodOfTravel;
}
/**
*
* @title: method
* @Description: 旅游方式
* @return: void
*/
public void method(){
methodOfTravel.Method();
}
}
public class StrategyTest {
public static void main(String[] args) {
MethodOfTravel airplane = new Airplane();
MethodOfTravel train = new Train();
TravelContext context = new TravelContext();
context.setMethodOfTravel(airplane);
context.method();
System.out.println("================================");
context.setMethodOfTravel(train);
context.method();
}
}
在一个使用策略模式的系统中,当存在的策略很多时,客户端管理所有策略算法将变得很复杂,如果在环境类中使用策略工厂模式来管理这些策略类将大大减少客户端的工作复杂度,其结构图如图所示。
... ...,欢迎指正!
相关阅读
原文:http://www.cnblogs.com/lewis0077/p/5133812.html(写的真的很好,理解的很透彻)在讲策略模式之前,我们先看一个日常生活中的小例