《他强由他强,清风拂山岗;他横由他横,明月照大江》之三

2024-05-11 19:28

本文主要是介绍《他强由他强,清风拂山岗;他横由他横,明月照大江》之三,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

常见的设计模式

1.策略模式

使用场景
通俗来说,策略模式就像是让你有一个策略的工具箱,在不同的情况下选择最合适的策略来解决问题。
使用场景通常包括以下一些:
多重条件判断语句:
当一个操作包含大量的条件判断语句,并且这些分支具有不同的行为时,可以使用策略模式来避免复杂的条件判断逻辑,让代码更加清晰、易于维护。
同一操作有多种实现:
当你有一个操作,它可以有多种不同的实现方式(算法),而且你希望在运行时根据不同的条件选择不同的实现时,策略模式可以帮你轻松做到这一点。
需要动态切换算法或行为:
如果你的程序需要动态地切换算法或行为,策略模式让这成为可能,并且不会让客户端与具体的算法实现耦合。
避免在客户代码中暴露复杂的、算法相关的数据结构:
通过策略模式,你可以隐藏算法的具体实现,只暴露一个简单的接口给客户端。这意味着,实现细节被封装在策略的内部,而客户端不需要了解这些细节。
提高算法的复用和扩展性:
策略模式使得添加新策略或者修改已有策略变得容易,因为新增加的策略并不会影响到那些使用策略的客户端代码。
不同场景切换不同策略:
例如在游戏开发中,不同的游戏角色可以选择不同的行进策略,如步行、奔跑、飞行等,在不同的游戏状态下也可以灵活切换。
测试和调试时模拟行为:
用策略模式,你可以在测试时轻易地将实际的操作替换为模拟操作,而不需要改变客户端代码。
举个例子:

// 策略接口
public interface Strategy {void execute();
}// 定制注解,用于标记策略的类型
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface StrategyType {String value();
}
@StrategyType("OperationA")
public class ConcreteStrategyA implements Strategy {@Overridepublic void execute() {System.out.println("Executing strategy A");}
}@StrategyType("OperationB")
public class ConcreteStrategyB implements Strategy {@Overridepublic void execute() {System.out.println("Executing strategy B");}
}

现在,我们需要一个策略管理器(或上下文),它可以根据注解选择正确的策略并执行:

public class StrategyManager {private Map<String, Strategy> strategies;public StrategyManager() {strategies = new HashMap<>();// 在构造方法中加载所有策略loadStrategies();}// 过滤并注册实现了 Strategy 接口的类private void loadStrategies() {// 伪代码: 使用反射枚举 Strategy 接口的所有实现,并收集它们的注解值Reflections reflections = new Reflections("your.package.name");Set<Class<? extends Strategy>> strategyClasses = reflections.getSubTypesOf(Strategy.class);for (Class<? extends Strategy> clazz : strategyClasses) {StrategyType annotation = clazz.getAnnotation(StrategyType.class);if (annotation != null) {try {strategies.put(annotation.value(), clazz.getDeclaredConstructor().newInstance());} catch (Exception e) {// 异常处理}}}}// 根据策略类型执行策略public void executeStrategy(String strategyType) {Strategy strategy = strategies.get(strategyType);if (strategy != null) {strategy.execute();} else {throw new IllegalArgumentException("No strategy found for type: " + strategyType);}}
}

使用方式:

public class AnnotationStrategyDemo {public static void main(String[] args) {StrategyManager manager = new StrategyManager()

这篇关于《他强由他强,清风拂山岗;他横由他横,明月照大江》之三的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/980435

相关文章

LLM 模型压缩之三: FoldGPT

0. 资源链接 论文: FoldGPT: Simple and Effective Large Language Model Compression Scheme 项目: to be released. 1. 背景动机 现有的大语言模型推理存在以下问题: LLM 模型因为有大量的参数,以及 next token 的预测方式,导致 LLM 模型推理慢,计算消耗大。 模型压缩,量化和

selenium 自动化之三----元素定位多窗口切换

针对多窗口切换操作,定位方式 import timefrom selenium import webdriverdriver=webdriver.Chrome()driver.implicitly_wait(10)driver.get("http://www.baidu.com")sreach_window=driver.current_window_handle # 获取当前窗口dri

内部排序之三:堆排序

前言    堆排序、快速排序、归并排序(下篇会写这两种排序算法)的平均时间复杂度都为O(n*logn)。要弄清楚堆排序,就要先了解下二叉堆这种数据结构。本文不打算完全讲述二叉堆的所有操作,而是着重讲述堆排序中要用到的操作。比如我们建堆的时候可以采用堆的插入操作(将元素插入到适当的位置,使新的序列仍符合堆的定义)将元素一个一个地插入到堆中,但其实我们完全没必要这么做,我们有执行操作更少的方法,

RFC6455-The WebSocket protocol 之三:WebSocket URIs

3.WebSocket URIs This specification defines two URI schemes, using the ABNF syntax defined in RFC 5234 [RFC5234], and terminology and ABNF productions defined by the URI specification RFC 3986 [RF

Windows驱动_UMDF驱动之三UMDF取消IO完成IO访问IO类型HID驱动

Canceling I/O Requests(取消I/O请求)         正在被设备处理的IO请求,可以被应用程序,系统,或者驱动取消。如果设备的IO操作被取消,IO管理器尝试取消所有的和IO操作所关联的没有被处理的IO请求。设备驱动可以一个例程得到通知但IO管理器尝试取消IO请求的时候,然后驱动可以通过设置IO请求的完成状态值为ERROR_OPERATION_ABORTED取消请求。

基于清风数学建模视频课的思维导图

B站视频课地址 数学建模学习交流

Vue通信组件之三:父组件向子组件传值

【父组件向子组件传值data和props区别】      子组件中默认是无法访问到父组件中data上的数据和methods中的方法。我们可以在父组件引用子组件的时候,通过属性绑定(v-bind:)的形式,把需要传递给子组件的数据,以属性绑定的形式,传递到子组件内部,以供子组件使用。      子组件的data(){}中的数组是子组件自己私有的数据,而子组件props中的数据是父组件传

局部凸空间及其在算子空间中的应用之三

局部凸空间及其在算子空间中的应用之三 前言一、豪斯多夫局部凸空间的例子二、线性算子的连续性刻画总结 数学是一种艺术,如同诗歌一样,它寻求美和简洁。—— André Weil 前言 本文继续该系列的上一篇文章,介绍一个特殊而重要的豪斯多夫局部凸空间,并证明其上的结论。然后我们给出了线性算子的连续性刻画的几个重要结论,方便后续文章的引用。 一、豪斯多夫局部凸空间的例子

主题模型Gensim入门系列之三:主题和变换

系列目录: (1)主题模型Gensim入门系列之一:核心概念 (2)主题模型Gensim入门系列之二:语料和向量空间 (3)主题模型Gensim入门系列之三:主题和变换 (4)主题模型Gensim入门系列之四:文本相似度查询 ————————————————————————————   本节主要介绍Gensim中从一个向量空间转换到另外一个向量空间的变换的概念,通过一个简单的语料加以

CAFFE-probuffer之三

之前已经发了三篇有关Protocol Buffer的技术博客,其中第一篇介绍了Protocol Buffer的语言规范,而后两篇则分别基于C++和Java给出了一些相对比较实用而又简单的示例。由于近期工作压力很大,因此对于是否继续写本篇博客也确实让我纠结了几天。但每每想到善终如始则无败事这句话时,最终的决定还是既然开始了,就要尽自己最大的努力去做,而不要留有丝毫的遗憾。       该篇Bl