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

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

hot3.png

设计模式 之 策略模式

定义

提供几个算法策略,选择其中一个策略去执行。

优点

  • 由于将算法封装成单独的策略,策略可以灵活切换。
  • 扩展性好,符合开闭原则。

缺点

  • 策略多,类也会变多
  • 策略类需要对外暴露

代码

场景

常见的加、减、乘、除,客户端选择其中一个算法进行计算。

代码

IOperation

/** * 操作接口 * @author GaoYuan * @date 2018/11/11 下午2:45 */public interface IOperation {    /** 执行计算 */    int operation(int a,int b);}

加、减、乘、除具体的算法实现类

/** * 加法 */public class AddOperation implements IOperation{    @Override    public int operation(int a, int b) {        return a + b;    }}/** * 减法 */public class SubOperation implements IOperation{    @Override    public int operation(int a, int b) {        return a - b;    }}/** * 乘法 */public class MulOperation implements IOperation{    @Override    public int operation(int a, int b) {        return a * b;    }}/** * 除法 */public class DivOperation implements IOperation{    @Override    public int operation(int a, int b){        if(b == 0){            return 0;        }        return a / b;    }    }

Context

/** * 使用者 * @author GaoYuan * @date 2018/11/11 下午2:51 */public class Context {    IOperation iOperation;    public Context(IOperation iOperation) {        this.iOperation = iOperation;    }    public int execute(int a, int b){        return iOperation.operation(a, b);    }}

测试

public static void main(String[] args){    // 加    Context context = new Context(new AddOperation());    System.out.println(context.execute(6,2));    // 减    context = new Context(new SubOperation());    System.out.println(context.execute(6,2));    // 乘    context = new Context(new MulOperation());    System.out.println(context.execute(6,2));    // 除    context = new Context(new DivOperation());    System.out.println(context.execute(6,2));}

结果输出:

84123

策略模式 与 状态模式 区别

相同点

  • 类的结构都差不多

不同点

  • 状态模式 侧重 状态之间的切换,在状态A执行完毕后自己控制状态指向状态B,根据状态改变行为。
  • 策略模式 侧重 调用者选择其中一种策略进行执行。根据不同的条件选择不同的策略。

策略模式 与 简单工厂模式 区别

相同点

  • 最终结果是一致的,都是根据某个情景,执行最终的算法

不同点

概念上,或者说最本质的区别

  • 简单工厂模式属于创建型模式,调用者,根据条件,可以获取直接创建好的目标对象,然后调用该对象对应的方法即可。
  • 策略模式属于行为型模式,调用者需要先创建Context对象,然后自行选择算法,以便具体调用。

当然,在一定程度上,两者也可以相结合。

码云

博客

欢迎关注我的个人微信订阅号:(据说这个头像程序猿专用)

输入图片说明

转载于:https://my.oschina.net/gmarshal/blog/2876104

你可能感兴趣的文章
“宽带中国”尚未成功 FTTH应从“狂轰乱炸”进入“精耕细作”
查看>>
探秘视频编码黑科技,窄带高清2.0视觉模型及场景实战
查看>>
现场报道:第二届中国云计算大会开幕
查看>>
如何支撑HTAP场景——HybridDB for MySQL系统架构和技术演进
查看>>
云计算在存储领域的发展趋势和优势
查看>>
CSS3简单动画
查看>>
模块化数据中心的现状和潜在市场分析
查看>>
数据中心里的那些XDC们
查看>>
容器化操作系统概览
查看>>
高铁与机场成交通信息化建设的双驾马车
查看>>
上云不难,用友云赋能产业 让企业服务都在这!
查看>>
Radware攻击缓解解决方案助美国移动运营商进行移动网络扩展
查看>>
业界为何会误读公共云对红帽的影响?
查看>>
方程式组织的漏洞程序稍作修改 就可以攻击最新的思科防火墙
查看>>
HackerOne第二名白帽专访:业余挖洞,两年赚 40 万美金
查看>>
揭秘云梦如何借力阿里云云市场创富千万
查看>>
实时计算:通往物联网的网关?
查看>>
中国人工智能学会通讯——构建强健的人工智能:原因及方式 1. 针对不确定性的决策...
查看>>
IBM Power业务掌门人:认知时代是计算系统演进的拐点
查看>>
有了邮件防火墙你就安全了吗?想法太单纯了……
查看>>