折腾Java设计模式之策略模式
简介
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。简单理解就是一组算法,可以互换,再简单点策略就是封装算法。
意图 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
主要解决 在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
何时使用 一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决 将这些算法封装成一个一个的类,任意地替换。
主要角色
- 上下文Context,拥有一个Strategy的引用
- 抽象策略Strategy,往往是一个接口(占大部分情况)或者抽象类,通常提供各种具体策略的接口
- 具体策略,这就是重点了,封装了各种具体的算法
UML
应用实例
- 诸葛亮的锦囊妙计,每一个锦囊就是一个策略;
- 旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略;
- JAVA AWT 中的 LayoutManager;
优点 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点 1、策略类会增多。 2、所有策略类都需要对外暴露。
使用场景
- 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
- 一个系统需要动态地在几种算法中选择一种。
- 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
注意事项: 如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
项目描述
1.操作行为
simple1包,主要对操作行为包装了加减乘除方法。
@Slf4j
public class Application {
public static void main(String[] args) {
Context context = new Context(new AddStrategy());
log.info("10 + 5 = {}", context.executeStrategy(10, 5));
context.setStrategy(new SubstractStrategy());
log.info("10 - 5 = {}", context.executeStrategy(10, 5));
context.setStrategy(new MultiplyStrategy());
log.info("10 * 5 = {}", context.executeStrategy(10, 5));
context.setStrategy(new DivideStrategy());
log.info("10 / 5 = {}", context.executeStrategy(10, 5));
}
}
执行结果
2.出现方式
simple2包描述,主要对出行方式的包装,包装了3种出行方式,
执行类
public class TravelApplication {
public static void main(String[] args) {
Context context = new Context(new BusStrategy());
context.executeStrategy("老王");
context.setStrategy(new BicycleStrategy());
context.executeStrategy("老张");
context.setStrategy(new WalkStrategy());
context.executeStrategy("老李");
}
}
执行结果
策略上下文
@Data
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
/**
* 出行
*
* @return
*/
public void executeStrategy(String name) {
strategy.travel(name);
}
}
抽象策略
public interface Strategy {
/**
* 出现方法
*
* @return
*/
void travel(String name);
}
参考
折腾Java设计模式之策略模式的更多相关文章
- 折腾Java设计模式之状态模式
原文地址 折腾Java设计模式之状态模式 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.在状态模式中,我们创建表示各种状态的对象 ...
- 折腾Java设计模式之模板方法模式
博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...
- 折腾Java设计模式之建造者模式
博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...
- 折腾Java设计模式之备忘录模式
原文地址:折腾Java设计模式之备忘录模式 备忘录模式 Without violating encapsulation, capture and externalize an object's int ...
- 折腾Java设计模式之访问者模式
博客原文地址:折腾Java设计模式之访问者模式 访问者模式 Represent an operation to be performed on the elements of an object st ...
- 折腾Java设计模式之命令模式
博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the pa ...
- Java设计模式1——策略模式(Strategy Pattern)
最近觅得一本好书<您的设计模式>,读完两章后就能断言,一定是一头极品屌丝写的,而且是专写给开发屌丝男的智慧枕边书,小女子就委屈一下,勉强看看,人笨,谁让他写得这么通俗易懂呢!为了加深理解, ...
- JAVA设计模式 之 策略模式
一. 定义 设计模式定义了算法族,分别封装起来,让他们之间可以互相替代,此模式让算法的变化独立于使用算法的客户(该定义来自于Head First 设计模式). 二. 应用场景 当我们在应用程序中完成一 ...
- Java设计模式之策略模式(一)
今年寒假没有回家,打算利用这个假期的时间进行学习设计模式,这一个人感觉比较牛的知识,前一段时间一直在忙着搞自己的专业课,还有就是捣鼓了一下Linux系统,没有好好的学习关于Java还有Android方 ...
随机推荐
- socket 套接字服务器端和客户端发送信息
import socket import threading host='' port=6889 def cilenThred(conn,addr): print("成功接受客户端{}的连接 ...
- 从协议入手,剖析OAuth2.0(译 RFC 6749)
1.介绍 https://tools.ietf.org/html/rfc6749 传统的client-server授权模型,客户端通过使用凭证(通常的用户名和明文密码)访问服务端受保护的资 ...
- 打个响指Selenium自动化开启
最近斗哥在朋友的影响下,接触了自动化测试工具中的一个项目:appium自动化测试脚本. appium类库封装了标准Selenium客户端类库,为用户提供所有常见的JSON格式selenium命令以及额 ...
- FFmpeg命令行工具学习(一):查看媒体文件头信息工具ffprobe
一.简述 ffprobe是ffmpeg命令行工具中相对简单的,此命令是用来查看媒体文件格式的工具. 二.命令格式 在命令行中输入如下格式的命令: ffprobe [文件名] 三.使用ffprobe查看 ...
- .net core 灵活读取配置文件
using Microsoft.Extensions.Configuration; using System; using System.Collections.Generic; using Syst ...
- [Swift]LeetCode643. 子数组最大平均数 I | Maximum Average Subarray I
Given an array consisting of n integers, find the contiguous subarray of given length k that has the ...
- [Swift]LeetCode835. 图像重叠 | Image Overlap
Two images A and B are given, represented as binary, square matrices of the same size. (A binary ma ...
- Android--逐帧动画FrameAnimation
前言 开门见山,本篇博客讲解一下如何在Android平台下播放一个逐帧动画.逐帧动画在Android下可以通过代码和XML文件两种方式定义,本篇博客都将讲到,最后将以一个简单的Demo来演示两种方式定 ...
- Android--使用Camera拍照
前言 在开发Android应用的时候,如果需要调用摄像头获取拍摄的照片,除了通过Intent调用系统现有相机应用拍摄照片之外,还可以通过直接调用Camera硬件去去获取摄像头拍摄的照片.本篇博客将讲解 ...
- NMF学习练习:做电影推荐
NMF是很久以前学的,基本快忘没了,昨天YX提出来一个关于NMF(同音同字不同义)的问题,才又想起来. 自己的学习笔记写的比较乱,好在网上资料多,摘了一篇,补充上自己笔记的内容,留此助记. NMF概念 ...