1/24 设计模式之策略设计模式 Strategy Pattern
2020/2/26 17:15:51
本文主要是介绍1/24 设计模式之策略设计模式 Strategy Pattern,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
类别:结构型设计模式
目的:把同类的代码进行单独封装、使得需要使用这部分代码的用户可以按需使用
典型场景
对用户上传的图片应用不同的压缩算法和滤镜
压缩算法:
- jpeg格式
- png格式
滤镜:
- blackAndWhite滤镜
- backgroundBlur滤镜
硬编码
public class HardCode { public static void main(String[] args) { var fileName = "test.jpg"; var compressor = "jpeg"; var filter = "blackAndWhite"; handleUpload(fileName, compressor, filter); } public static void handleUpload(String fileName, String compressor, String filter) { if (compressor.equals("jpeg")) { System.out.println("应用jpeg压缩算法..."); } else if (compressor.equals("png")) { System.out.println("应用png压缩算法..."); } if (filter.equals("blackAndWhite")) { System.out.println("应用blackAndWhite滤镜"); } else if (filter.equals("backgroundBlur")) { System.out.println("应用blackAndBlur滤镜"); } } } 复制代码
模式实现
代码
按照代码类别定义接口
上面的代码分成两类,一类是压缩算法,另一类是滤镜算法
压缩算法接口
public interface Compressor { void apply(String fileName); } 复制代码
2个压缩算法的具体实现
public class JpegCompressor implements Compressor { @Override public void apply(String fileName) { System.out.println("应用jpeg压缩算法..."); } } public class PngCompressor implements Compressor { @Override public void apply(String fileName) { System.out.println("应用png压缩算法..."); } } 复制代码
滤镜算法
public interface Filter { void apply(String fileName); } 复制代码
2个滤镜算法的具体实现
public class BlackAndWhiteFilter implements Filter { @Override public void apply(String fileName) { System.out.println("应用blackAndWhite滤镜"); } } public class BackgroundBlurFilter implements Filter { @Override public void apply(String fileName) { System.out.println("应用backgroundBur滤镜"); } } 复制代码
使用策略
public static void main(String[] args) { var fileName = "test.jpg"; var compressor = new JpegCompressor(); var filter = new BlackAndWhiteFilter(); handleUpload(fileName, compressor, filter); } public static void handleUpload(String fileName, Compressor compressor, Filter filter) { compressor.apply(fileName); filter.apply(fileName); } 复制代码
UML
![](/upload/202002/26/202002261715510733.png)
为什么策略模式更好
![](/upload/202002/26/202002261715511914.png)
可以看到这里个策略模式把具体的算法实现单独抽离到独立的类中了,调用方流程更加清晰,同时,单独的具体算法实现类也更容易被复用了
一些注意的点
每个策略的具体实现可以很复杂,通过封装,使得这部分复杂的代码保持了独立
策略对象由用户进行创建并传递到处理方法中: handleUpload(String fileName, Compressor compressor, Filter filter)
参考资料
这篇关于1/24 设计模式之策略设计模式 Strategy Pattern的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-08如何在敏捷项目中实现高效测试?
- 2024-07-08用户故事一定要有 “So that...” 吗?
- 2024-07-04TiDB 资源管控的对撞测试以及最佳实践架构
- 2024-07-03万字长文聊聊Web3的组成架构
- 2024-07-02springboot项目无法注册到nacos-icode9专业技术文章分享
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt