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

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

策略模式(Stratrgy Pattern)中体现了两个非常基本的面向对象设计的原则

- 封装变化的概念
- 编程中使用接口,而不是对接口的实现

策略模式的定义:

- 定义一组算法,将每个算法都封装起来,并且使他们之间可以互换
- 策略模式使这些算法在客户端调用它们的时候能够互不影响地改变

策略模式的意义:

- 策略模式使开发人员能够开发出由许多可替换的部分组成的软件,并且各个部分之间是弱连接
- 弱连接的特性使软件具有更强的可扩展性,易于维护,更重要的是,它大大提高了软件的可重用性

策略模式的组成:

- 抽象策略角色:策略类,通常由一个接口或者抽象类实现(comparator)
- 具体策略角色:包装了相关的算法和行为(自定义类实现comparator)
- 环境角色:持有一个策略类的引用,最终给客户端调用(TreeSet可以传入自定义类的实现)

策略模式的实现:

- 策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以互相替换
- 策略模式使得可以在不影响到客户端的情况下发生变化。使得策略模式可以把行为和环境分开来
- 环境类负责维持和查询行为类,各种算法则在具体策略中提供。由于算法和环境独立开来,算法的修改都不会影响环境和客户端

抽象策略角色:

public interface Strategy {    public int caculator(int a, int b);}

具体策略角色:

public class AddStrategy implements Strategy {
@Override public int caculator(int a, int b) { return a + b; }}
public class SubtractStrategy implements Strategy {
@Override public int caculator(int a, int b) { return a - b; }}

环境角色:

public class Environment {    private Strategy strategy;    public Environment(Strategy strategy) {        this.strategy = strategy;    }    public Strategy getStrategy() {        return strategy;    }    public void setStrategy(Strategy strategy) {        this.strategy = strategy;    }    public int caculator(int a, int b) {        return strategy.caculator(a, b);    }}

客户端使用:

public class Client {    public static void main(String[] args) {        AddStrategy addStrategy = new AddStrategy();        Environment environment = new Environment(addStrategy);        System.out.println(environment.caculator(3, 4));        SubtractStrategy subtractStrategy = new SubtractStrategy();        environment.setStrategy(subtractStrategy);        System.out.println(environment.caculator(3, 4));    }}

策略模式的缺点:

- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类
- 造成很多的策略类

解决方案:

采用工厂方法

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

你可能感兴趣的文章
elasticsearch7.3版本已经不需要额外安装中文分词插件了
查看>>
【重大好消息】elasticsearch 7.3版本已经可以免费使用x-pack就可以设置账号和密码了,让你的数据不再裸奔
查看>>
解决使用logstash中jdbc导入mysql中的数据到elasticsearch中tinyint类型被转成布尔型的问题的方法
查看>>
elasticsearch7.3版本环境搭建(一)elasticsearch安装和配置
查看>>
SEO基本功:站内优化的一些基本手段
查看>>
centos6系列和7系列如何对外开放80,3306端口号或者其他端口号
查看>>
为什么您宁愿吃生活的苦,也不愿吃学习的苦?为什么你不愿意去学习呢
查看>>
解决elasticsearch7.3版本安装过程中遇到的包括内存不够、线程不够等问题
查看>>
日常项目测试用例检查点(来自一线测试人员的吐血总结)
查看>>
网站建设之域名注册和域名备案
查看>>
解决bootstrap时间输入框总被浏览器记住的记录遮挡住的问题
查看>>
git将一个分支完全覆盖另外一个分支如:dev分支代码完全覆盖某一个开发分支
查看>>
elasticsearch7.3版本环境搭建(二)可视化管理后台kibana的安装和配置
查看>>
elasticsearch7.3版本环境搭建(三)可视化管理后台kibana的汉化(设置中文界面)
查看>>
记录一次DDos攻击实战
查看>>
分享一首小诗--《致程序员》
查看>>
为什么百度只抓取了首页而不抓取我的网站的内页的原因分析
查看>>
年薪170万的阿里P8级员工征婚有感--话说阿里真有钱,这员工要求的条件真多
查看>>
又是一年桂花飘香时,祝我们伟大的祖国70年华诞更加繁荣昌盛,祝大家国庆节快乐
查看>>
谷歌浏览器chrome即将在2020年底停止支持flash,我们程序员该怎么办
查看>>