设计模式之策略模式详解

目录

什么是策略模式

应用场景

业务场景实现

抽象类

实现类

Context上下文

测试类

策略模式的优缺点


什么是策略模式

他将定义的算法家族、分别封装起来,让他们之间可以相互替换,从而让算法的变化不会影响到使用算法的用户。

策略模式使用的就是面向对象的继承和多态机制,从而实现同一行为在不同场景下具备不同实现。

应用场景


策略模式在生活中应用很多。比如一个人的胶水比例与他的工资有关,不同的工资水平对应不同的税率;再比如我们在下单前需要选择支付方式,或者是商店折扣、比如支付宝、微信等。

策略模式可以解决在多种算法相似的情况下,避免使用if.else或switch…case带来的复杂性和臃肿性。在日常业务开发中,策略模式适用于以下场景:


首先看下策略模式的通用UML类图:

从类图中,我们可以看到,策略模式主要包含三种角色:

上下文角色(Context)

用来操作策略的上下文环境,屏蔽高层模块(客户端)对策略,算法的直接访问,封装可能存在的变化。

抽象策略角色(Strategy)

规定策略或算法的行为

具体策略角色(Concrete Strategy)

具体的策略或算法实现

业务场景实现

抽象类

/*** 策略类,定义所有支持的算法公共接口*/
/*** 抽象算法类*/
public abstract class strategy {//算法方法public abstract void algorithmInterface();}

实现类

public class ConcreteStrategyA extends strategy{@Overridepublic void algorithmInterface() {System.out.println("算法A实现");}
}
public class ConcreteStrategyB extends strategy{@Overridepublic void algorithmInterface() {System.out.println("算法B实现" );}
}
public class ConcreteStrategyC extends strategy{@Overridepublic void algorithmInterface() {System.out.println("算法C实现");}
}

Context上下文

/*** 上下文,维护对象的引用*/
public class content {strategy strategy;public content(策略模式.strategy strategy) {this.strategy = strategy;}public void  contentInterface(){//根据具体的策略对象,调用琦算法的方法strategy.algorithmInterface();}
}

测试类

public class main {public static void main(String[] args) {content content1;content1 = new content(new ConcreteStrategyA());content1.contentInterface();content1 = new content(new ConcreteStrategyB());content1.contentInterface();content1 = new content(new ConcreteStrategyC());content1.contentInterface();}
}

策略模式的优缺点

优点

  • 策略模式符合开闭原则
  • 避免使用多重条件转移语句,如if…else和switch这种。
  • 使用策略模式可以提高算法的保密性和安全性

缺点

  • 客户端需要知道所有的策略,并且自行决定使用哪一个策略类
  • 代码中会产生非常多的策略类,造成代码的臃肿,怎加维护难度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/506304.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

02、MongoDB -- MongoDB 的安全配置(创建用户、设置用户权限、启动安全控制、操作数据库命令演示、mongodb 的帮助系统介绍)

目录 MongoDB 的安全配置演示前准备:启动 mongodb 服务器 和 客户端 :1、启动单机模式的 mongodb 服务器2、启动 mongodb 的客户端 MongoDB 的安全配置启动演示用到的 mongodb 服务器 和 客户端启动单机模式的 mongodb 服务器:启动 mongodb 的…

Python 潮流周刊#40:白宫建议使用 Python 等内存安全的语言

△△请给“Python猫”加星标 ,以免错过文章推送 你好,我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容,大部分为英文。本周刊开源,欢迎投稿[1]。另有电报频道[2]作为副刊,补充发布更加丰富的资讯,…

事件

1.按钮 现在默认是正常了 &#xff0c;英文 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_heigh…

springboot+vue学生网上请假系统

学生网上请假系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了学生网上请假系统的开发全过程。通过分析学生网上请假系统管理的不足&#xff0c;创建了一个计算机管理学生网上请假系统的方案。文章介绍了…

Numpy教程

文章目录 数组基础文件与字符串多项式分布实战 Numpy绝对可以说是支撑Python地位的最重要的包了&#xff0c;几乎所有能叫出名的Python计算库&#xff0c;都不可避免地调用了Numpy&#xff0c;Numpy官网也列出了一些&#xff0c;大致如下图这样&#xff0c;在科学计算领域&…

数字化转型导师坚鹏:证券公司数字化思维升级之道

证券公司数字化思维升级之道 ——数字化思维之六脉神剑 课程背景&#xff1a; 很多证券公司存在以下问题&#xff1a; 不知道数字化转型如何改变思维模式&#xff1f; 不清楚需要建立什么样的数字化思维&#xff1f; 不知道如何开展数字化思维提升工作&#xff1f; 课…

一文速通鸿蒙开发

应用程序包结构 1、一个应用可以包含一个或多个module&#xff0c;module是HarmonyOS基本功能单元&#xff0c;每个module都可以独立编译和运行&#xff1b;module分为ability和library两种类型&#xff0c;ability编译后为可安装的hap文件&#xff0c;library编译后为har或hs…

UE4c++ ConvertActorsToStaticMesh ConvertProceduralMeshToStaticMesh

UE4c ConvertActorsToStaticMesh 创建Edior模块&#xff08;最好是放Editor模块毕竟是编辑器代码&#xff09;创建蓝图函数UBlueprintFunctionLibraryUTestFunctionLibrary.hUTestFunctionLibrary.cpp:.Build.cs 目标:为了大量生成模型&#xff0c;我们把虚幻带有的方法迁移成函…

【算法与数据结构】复杂度深度解析(超详解)

文章目录 &#x1f4dd;算法效率&#x1f320; 算法的复杂度&#x1f320; 时间复杂度的概念&#x1f309;大O的渐进表示法。 &#x1f320;常见复杂度&#x1f320;常见时间复杂度计算举例&#x1f309;常数阶O(1)&#x1f309;对数阶 O(logN)&#x1f309;线性阶 O(N)&#x…

js监听网页iframe里面元素变化其实就是监听iframe变化

想要监听网页里面iframe标签内容变化&#xff0c;需要通过监听网页dom元素变化&#xff0c;然后通过查询得到iframe标签&#xff0c;再通过iframe.contentWindow.document得到ifram内的document&#xff0c;然后再使用选择器得到body元素&#xff0c;有了body元素&#xff0c;就…

备战蓝桥杯---状态压缩DP基础2之TSP问题

先来一个题衔接一下&#xff1a; 与上一题的思路差不多&#xff0c;不过这里有几点需要注意&#xff1a; 1.因为某一列的状态还与上上一行有关&#xff0c;因此我们令f[i][j][k]表示第i行状态为j,第i-1行状态为k的最大炮兵数。 因此&#xff0c;我们可以得到状态转移方程&…

AWTK 开源串口屏开发(11) - 天气预报

# AWTK 开源串口屏开发 - 天气预报 天气预报是一个很常用的功能&#xff0c;在很多设备上都有这个功能。实现天气预报的功能&#xff0c;不能说很难但是也绝不简单&#xff0c;首先需要从网上获取数据&#xff0c;再解析数据&#xff0c;最后更新到界面上。 在 AWTK 串口屏中…