关键词:
文章目录
策略模式
概念
策略模式(Strategy Pattern)也叫政策模式,是一种比较简单的模式。
它的目的是定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换,使得算法可以在不影响到客户端的情况下发生变化。
策略模式的通用类图如下图所示:
策略模式涉及以下3个角色:
角色 | 说明 |
---|---|
环境(Context)角色 | 该角色也叫上下文角色,起到承上启下的作用,屏蔽高层模块对策略、算法的直接访问,它持有一个Strategy类的引用。 |
抽象策略(Strategy)角色 | 该角色对策略、算法进行抽象,通常定义每个策略或算法必须具有的方法和属性。 |
具体策略(Concrete Strategy)角色 | 该角色实现抽象策略中的具体操作,含有具体的算法。 |
代码示例
抽象策略Strategy的代码如下所示:
package com.shixun.design.strategy;
/**
* 抽象策略 Strategy类
*/
public abstract class Strategy
public abstract void strategyInterface();
具体策略ConcreteStrategy的代码如下所示:
package com.shixun.design.strategy;
/**
* 具体策略 ConcreteStrategy 类
* 实现抽象策略中的具体操作,含有具体的算法
*/
public class ConcreteStrategy extends Strategy
@Override
public void strategyInterface()
System.out.println("呜呼啦呼,实现具体策略!");
环境角色Context的代码如下所示:
package com.shixun.design.strategy;
public class Context
private Strategy strategy = null;
public Context(Strategy strategy)
this.strategy = strategy;
public void contextInterface()
this.strategy.strategyInterface();
编写测试代码:
package com.shixun.design.strategy;
public class Test
public static void main(String[] args)
Context context = new Context(new ConcreteStrategy());
context.contextInterface();
运行结果如下所示:
优缺点
策略模式优点
策略模式包括如下优点:
- 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族,恰当地使用继承可以把公共的代码移到父类中,从而避免代码重复。
- 策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为,如果不用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样算法或行为的使用者就和算法本身混在一起,从而不可能再独立演化。
- 使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,这比使用继承的办法还要原始和落后。
策略模式缺点
策略模式包括如下缺点:
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类,即策略模式只适用于客户端知道所有的算法或行为的情况。
- 策略模式造成很多的策略类。有时候可以通过把依赖于环境的状态保持到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。可以使用享元模式来减少对象的数量。
应用场景
策略模式有如下几个应用场景:
- 多个类只是在算法或行为上稍有不同的场景。
- 算法需要自由切换的场景。
- 需要屏蔽算法规则的场景。
注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
综合实战:多个算法切换
定义抽象策略接口
public interface Strategy
public int doOperation(int num1, int num2);
创建实现接口的具体策略类:
两数加法算法:
public class OperationAdd implements Strategy
@Override
public int doOperation(int num1, int num2)
return num1 + num2;
两数减法算法:
public class OperationSubtract implements Strategy
@Override
public int doOperation(int num1, int num2)
return num1 - num2;
两数乘法算法:
public class OperationMultiply implements Strategy
@Override
public int doOperation(int num1, int num2)
return num1 * num2;
创建 Context 类:
public class Context
private Strategy strategy;
public Context(Strategy strategy)
this.strategy = strategy;
public int executeStrategy(int num1, int num2)
return strategy.doOperation(num1, num2);
编写测试类:
public class Test
public static void main(String[] args)
Context context = new Context(new OperationAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationSubtract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationMultiply());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
运行结果:
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50
java责任链模式之总有你想不到的知识(代码片段)
文章目录责任链模式概念代码案例:优缺点优点缺点应用场景应用案例:多级处理责任链模式概念责任链模式(ChainofResponsibilityPattern)是一种常见的行为模式,它的目的是使多个对象都有机会处理请求,... 查看详情
java观察者模式之总有你想不到的知识(代码片段)
文章目录观察者模式概念代码案例:优缺点优点缺点应用场景观察者模式概念观察者模式(ObserverPattern)也称发布订阅模式,它的目的是定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则... 查看详情
java单例模式之总有你想不到的知识
文章目录Java单例模式单例模式是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式单例模式确保在一个应用程序中某一个类只有一个实例,而且自行实例化并向整个系统提供... 查看详情
java工厂模式之总有你想不到的知识(代码片段)
文章目录Java工厂模式概念三种工厂模式简单工厂模式代码示例工厂方法模式代码示例抽象工厂模式工厂模式优缺点优点:缺点:Java工厂模式概念工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程... 查看详情
java抽象工厂模式之总有你想不到的知识(代码片段)
文章目录抽象工厂概念优缺点优点缺点适用场景代码案例抽象工厂使用工厂方法模式足以应付我们可能遇到的大部分业务需求。但是当产品种类非常多时,就会出现大量的与之对应的工厂类,这不应该是我们所希望的。... 查看详情
深入jdk源码,这里总有你不知道的知识点!
Java的基础知识有很多,但是我认为最基础的知识应该要属jdk的基础代码,jdk的基础代码里面,有分了很多基础模块,其中又属jdk包下面的lang包最为基础。我们下面将总结和分析一下lang包下面最为基础和常用的几个部分。1:常用... 查看详情
166个最常用的linux命令汇总,总有你需要用到的!(代码片段)
我是二黑,一个快要秃头的测试人欢迎点赞收藏⭐留言如有错误敬请指正!我收集了一些软件测试资料,关注我公众号:程序员二黑,免费领取!最困难的时候,也就是我们离成功不远的时候!文... 查看详情
第一梦策略模式(代码片段)
写在之前这篇博客是自己开始Java设计模式系统学习之路记录,以前学习都是零零散散的,很多东西都是不常用就慢慢忘记了。为了跳出怪圈,也对学习过的知识整理成册,避免反复学习,让我们开始吧!--------------------------------... 查看详情
十家大厂,两百多道android面试题,总有你需要的(代码片段)
直接上正题:京东,字节跳动,美团,哔哩哔哩,声网,掌门教育,传音控股,得物,哈啰出行,小红书,其他厂经典题。前言前段时间在看机会,本文就是我对求职过程的一个总结... 查看详情
java设计模式之策略学习与掌握(代码片段)
文章目录前言定义优点缺点模式的结构与实现模式的结构模式的实现应用场景前言个人建议设计模式这一系列的文章,多关注定义和模式的代码实现。至于模式结构和扩展或者是应用场景,基本了解过一下就好,没必... 查看详情
详解设计模式之策略模式(代码片段)
在讲策略模式之前,我们先看一个日常生活中的小例子:现实生活中我们到商场买东西的时候,卖场往往根据不同的客户制定不同的报价策略,比如针对新客户不打折扣,针对老客户打9折,针对VIP客户打8... 查看详情
设计模式之简单工厂模式与策略模式(通过两种模式设计的计算器/java)(代码片段)
...小项目来练习使用设计模式。本次选择了简单工厂模式、策略模式以及两个模式混合使用来完成计 查看详情
设计模式之简单工厂模式与策略模式(通过两种模式设计的计算器/java)(代码片段)
...小项目来练习使用设计模式。本次选择了简单工厂模式、策略模式以及两个模式混合使用来完成计 查看详情
设计模式中的多态——策略模式详解(代码片段)
目录1.关于策略模式2.策略模式详解2.1策略模式定义2.2策略模式的UML类图3.策略模式的优点3.1一个使用策略模式的例子3.2与其他实现方式的对比3.3使用策略模式的优点4.使用工厂方法模式改进原有策略模式5.总结5.参考资料1.关于策... 查看详情
java策略模式(代码片段)
Java策略模式需求代码展示策略模式策略模式+简单工厂前记:欠下的迟早是要还的~~~还债第四篇~需求跟以前一样,先说需求:最近公司要做一个小商城,商城里的产品有不同的销售价格,有得是原价,... 查看详情
java策略模式(代码片段)
Java策略模式需求代码展示策略模式策略模式+简单工厂前记:欠下的迟早是要还的~~~还债第四篇~需求跟以前一样,先说需求:最近公司要做一个小商城,商城里的产品有不同的销售价格,有得是原价,... 查看详情
java策略模式(代码片段)
Java策略模式需求代码展示策略模式策略模式+简单工厂前记:欠下的迟早是要还的~~~还债第四篇~需求跟以前一样,先说需求:最近公司要做一个小商城,商城里的产品有不同的销售价格,有得是原价,... 查看详情
一文简单全面了解策略模式的使用花几分钟轻松掌握一个知识点(代码片段)
...您阅读本文,欢迎一键三连哦。本文重点:介绍策略模式概念以及实际应用。干货满满,建议收藏,需要用到时常看看。小伙伴们如有问题及需要,欢迎踊跃留言哦~~~。文章目录问题需求(支付系统渠道商... 查看详情