什么是策略模式
策略模式是一种行为模式。它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略)。策略模式主要用来平滑的处理算法的切换。
策略模式的角色和职责
Strategy(策略):
策略(算法)的抽象。
ConcreteStrategy(具体策略):
各种具体的算法(策略)的实现。
Context(容器类):
策略的外部封装类,或者说策略的容器类。根据不同策略执行不同的行为。策略由外部环境决定。
策略模式的优点、缺点
一、优点
1.策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免重复的代码。
2.策略模式提供了可以替换继承关系的办法。
3.使用策略模式可以避免使用多重条件转移语句。
二、缺点
1. 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
2. 策略模式会造成很多的策略类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可以共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。
策略模式的实现
策略模式的实现代码很简单,只需要一个策略抽象类,两个具体策略,一个用来封装策略的容器类。
就以商城打折为例,
一个策略为满500打七折。
一个策略为满200打八折。
策略抽象类
public interface Strategy {
//打折策略方法
public double discount(double num);
}
具体策略类
public class DiscountA implements Strategy{
//实现打八折的算法
@Override
public double discount(double num) {
return num * 0.8;
}
}
public class DiscountB implements Strategy{
//实现打七折的算法
@Override
public double discount(double num) {
return num * 0.7;
}
}
容器类
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
//由容器调用策略
public double discount(double num){
return this.strategy.discount(num);
}
}
测试类
public class MainClass {
public static void main(String[] args) {
double num = 500;
//选择哪种策略,是外部决定的。
Context context = new Context(new DiscountA());
double newnum = context.discount(num);
System.out.println("实际支付"+newnum+"元");
}
}
运行结果:
到这里策略模式的代码实现就完成了,哈哈哈!
单个策略模式觉得蛮简单的,但要是结合工厂模式、享元模式感觉还是不会,但先记下吧。