设计模式(二)——策略模式

策略模式


  • 介绍

    • 结构图:
      在这里插入图片描述
      (自我总结)核心: 工厂类(判断生成对象以及一系列以次对象为基础的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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值