策略模式
-
介绍
- 结构图:
(自我总结)核心: 工厂类(判断生成对象以及一系列以次对象为基础的getResult()方法)和顶层抽象类(用于管理一系列的实现类)
- 结构图:
-
优点:
- 前台(调用者):
只需要知到Context的使用规则就好了,相比较简单工厂连IStrategy的实际使用都不需要了解了 - 开发者:
可以根据需求在Context添加对象的方法组合(比如对象只有两个数的相加,我们可以在Context内部对此方法连续调用,实现三个数的算法),自由添加新的算法(添加实现类)
- 前台(调用者):
-
缺点:
- 不够满足开闭-原则(可以避免调用者的修改代码,但是在开发者和简单工厂一样需要维护if-else判断列表)
- Context的功能依赖内部的IStrategy,因此当Context一旦创建完成,功能就确定了。而简单工厂,可以返回新的对象所以不会产生这种情况
-
区别
- 简单工厂模式
- 很多人会把策略模式和简单工厂搞混,区别这两者的最直接的方式就是,是否需要
返回生成的对象
。 - 简单工厂更像是
对象层次
的处理,策略模式更像是方法层次
的处理
实现一个计算器
通过输入 + - ,对两个整型数字进行运算 。
一、结构图
通过图我们明白,当我们把测录模式创建之后,策略模式不像简单工厂那样,把产生的
实际对象返回
,而是在内部封装使用。因此开发人员甚至只要知道Context的使用规则和API就可以了
二、代码
// 模拟调用方 不属于策略模式的主体
public class StrategyPatternMain {
public static void main(String[] args) throws Exception {
// 定义初始数据
int num_a = 1;
int num_b = 0;
char char_opertion = '+';
// 创建Context并获取operation对象 隐藏了operation的创建过程
// 用户只需要知道createOperation以及getResut()的使用即可
OperationContext operationContext = new OperationContext(char_opertion);
// 使用对象得出结论
int result = operationContext.getResult(num_a, num_b);
System.out.println(result);
}
}
// Operation应用上下文
public class OperationContext{
// 注意了 这就是与普通的简单工厂不一样的地方,返回的对象保存在这
private Operation operation;
// 在实例化之处就解决了operation的使用
public OperationContext(char oper) throws Exception {
// 这里套用了简单工厂的创建对象的方式
switch (oper){
case '+' :
operation = new AddOperation();
case '-' :
operation = new descOperation();
default:
throw new Exception("该计算形式不合法");
}
}
// 用户调用API,调用者只会这个即可,不用知道Operation
int getResult(int num_a, int num_b) throws Exception{
if(operation != null){
return operation.getResut(num_a, num_b);
}else {
throw new Exception("尚未添加策略选择");
}
}
}
// Operation顶层抽象接口
public interface Operation {
// 计算抽象接口
int getResut(int num_a, int num_b);
}
// 加法计算器
public class AddOperation implements Operation {
@Override
public int getResut(int num_a, int num_b) {
return num_a + num_a;
}
}
// 减法计算器
public class descOperation implements Operation {
@Override
public int getResut(int num_a, int num_b) {
return num_a - num_b;
}
}