博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式(二)_ 策略模式
阅读量:6573 次
发布时间:2019-06-24

本文共 2193 字,大约阅读时间需要 7 分钟。

上篇学习了单例模式,接着学习,坚持就是胜利,今天主要学习下策略模式,参考了gitchat周君的相关课程,但是内容全部手打,拒绝粘贴。

什么是策略模式

策略模式的用意是针对一组算法,将每一个 算法封装到具有相同接口的独立类中,从而使得它们之间可以相互替换,此模式让算法的变化可以不影响客户端的情况下发生。

一般情况下,我们是将一种行为写成一个类方法,比如计算器的加、减、乘、除。而策略模式是将每一种算法写成一个类,然后动态的选择用哪种算法。

这里所说的算法并不是 “冒泡排序算法” 之类的算法。它可以是 一段代码,一个请求、一个业务操作。

实现计算器代码举例

第一次画uml 图。如有不对请指正

enter image description here

这个例子为加法和减法创建了一个类。具体代码如下

Operation 接口:

package com.zhb.service;public interface Operation {        public int doOperation(int num1,int num2);}

2个实现类,加法和减法

public class OperationAdd implements Operation{    @Override    public int doOperation(int num1, int num2) {                return num1 + num2;    }}public class OperationSub implements Operation{    @Override    public int doOperation(int num1, int num2) {                return num1 - num2;    }}

计算器类:

package com.zhb.main;import com.zhb.service.Operation;public class Calculator {        private Operation operation;    public void setOperation(Operation operation) {        this.operation = operation;    }        public int doOperation(int num1, int num2){        return this.operation.doOperation(num1, num2);    }    }

使用:

public static void main(String[] args) {        Calculator calculator = new Calculator();        OperationAdd add = new OperationAdd();        OperationSub sub = new OperationSub();                calculator.setOperation(add);        int result = calculator.doOperation(1, 2);        System.out.println(result);                calculator.setOperation(sub);        int result1 = calculator.doOperation(1, 1);        System.out.println(result1);            }

看到这里,大家一定和我一样疑惑,感觉这没必要建新的类,直接一个类2个add(),sub() 方法就可以搞定啊。你如果在写乘法,还要再写一个类。多麻烦。

的确,使用策略模式使代码增多,如果下面这种场景下

如果将你写好的计算器代码打包发布出去,供大家使用。如果大家后来发现,我不仅要加减乘除、还要开方。此时怎么办?

如果你用普通写法的计算器,你可能需要在类中 再增加开方的方法就好了。 但是你 提供的jar包。就算你提供源码,你希望别人修改你的源码不?一般提供出去的框架或库,都是经过千锤百炼的。经过无数次测试的,如果别人修改源码很容易产生不可预知的错误。再其次。实际工作中,你写的代码好还行,不好的话,说实话,看都不想看,别说改了。

如果你使用策略模式,你只需要定义一个开方的类实现Operation 接口。然后调用 calculator.setOperation(new 开方类()); 即可。

这里很好的体现了一个设计模式的基本原则:开闭原则。

开闭原则说的是 对修改关闭、对扩展开放。

优点

  • 遵守开闭原则,扩展性良好

缺点

  • 随着你的策略增加,你的类也会越来越多
  • 所有 的策略类都要暴露出去,所以如果在实际开发中你使用了策略模式,你一定要让你同事知道已有哪些策略。

例子代码后期会放到github上,每种设计模式的代码都会上传上去,敬请期待。

代码下载

学习不是要么0分,要么100分的。80分是收获;60分是收获;20分也是收获。有收获最重要。但是因为着眼于自己的不完美,最终放弃了,那就是彻底的0分了。

转载地址:http://zcmjo.baihongyu.com/

你可能感兴趣的文章
过去一年,被我们“高估”的技术清单
查看>>
魅族技术晚场回顾,算法、架构、AI之外,还要考虑未来
查看>>
Windows Server 2008 \u0026 2012在GCE上正式商用了
查看>>
自动化测试中的测试执行自动化
查看>>
GitHub增加了代码审查、项目管理等新功能
查看>>
中台之上(五):业务架构和中台的难点,都是需要反复锤炼出标准模型
查看>>
安全狗:云时代的服务器安全守护者
查看>>
Hazelcast发布开源流处理引擎Jet
查看>>
苹果watchOS 2引入WatchKit应用,并扩展了硬件支持
查看>>
深入浅出TensorFlow(七)TensorFlow计算加速
查看>>
Facebook开源图像处理库Spectrum,优化移动端图像生成
查看>>
精通敏捷测试
查看>>
搞容器,必须考虑这五大安全要素
查看>>
从程序员到架构师的最佳技术成长之路
查看>>
为什么中台是传统企业数字化转型的关键?
查看>>
使用模板将Web服务的结果转换为标记语言
查看>>
inno setup 打包脚本学习
查看>>
php 并发控制中的独占锁
查看>>
禁止微信浏览器的下拉滑动
查看>>
从pandas到geopandas
查看>>