首页 > 其他分享 >设计模式之策略模式

设计模式之策略模式

时间:2024-08-10 15:39:03浏览次数:9  
标签:移动 策略 角色 对象 接口 算法 模式 设计模式

策略模式

在策略模式(Strategy Pattern)中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式
在策略模式定义了一系列算法或策略,并将每个算法封装在独立的类中,使得它们可以互相替换。通过使用策略模式,可以在运行时根据需要选择不同的算法,而不需要修改客户端代码。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

主要解决的问题

解决在多种相似算法存在时,使用条件语句(如if...else)导致的复杂性和难以维护的问题。

使用场景

当一个系统中有许多类,它们之间的区别仅在于它们的行为时。

实现方式

  1. 定义策略接口:定义所有策略对象共享的公共行为,所有策略类都将实现这个统一的接口。
  2. 创建具体策略类:每个策略类封装一个具体的算法或行为并实现策略接口。
  3. 创建一个上下文类:包含一个策略对象的引用,并通过该引用调用策略。上下文类负责在运行时根据需要设置或更改策略对象。

关键代码

策略接口:规定了所有策略类必须实现的方法。
具体策略类:实现了策略接口,包含具体的算法实现。

结构

策略模式包含以下几个核心角色:

  1. 环境(Context):维护一个对策略对象的引用,负责将客户端请求委派给具体的策略对象执行。环境类可以通过依赖注入、简单工厂等方式来获取具体策略对象。
  2. 抽象策略(Abstract Strategy):定义了策略对象的公共接口或抽象类,规定了具体策略类必须实现的方法。
  3. 具体策略(Concrete Strategy):实现了抽象策略定义的接口或抽象类,包含了具体的算法实现。

策略模式通过将算法与使用算法的代码解耦,提供了一种动态选择不同算法的方法。客户端代码不需要知道具体的算法细节,而是通过调用环境类来使用所选择的策略。

image

例子:使用策略模式来管理游戏中不同角色的移动策略

首先,定义一个移动策略的接口(IMovementStrategy)(定义策略接口)
image
接着,为每个角色的移动策略创建具体的实现类(实现具体策略)
image
image
然后,创建角色类(Character),它包含一个移动策略的引用,并提供设置策略和执行移动的方法(创建上下文)
image
最后,在游戏的主逻辑中,我们创建不同角色的移动策略实例,并将它们分配给相应的角色对象:
image
image
在这个例子中,我们创建了一个IMovementStrategy接口来定义移动行为,然后为每个角色类型实现了具体的移动策略类。Character类封装了对移动策略的引用,并提供了设置和执行移动的方法。在Main方法中,我们创建了不同角色的移动策略实例,并将它们分配给了相应的角色对象。然后,我们调用角色的Move方法来执行它们的移动行为。如果需要,我们还可以在运行时动态地改变角色的移动策略。

总结:

策略模式就像烤冷面,可以从多种酱料中选择一种,但也只能选一种。你选什么酱,他就是什么味。

标签:移动,策略,角色,对象,接口,算法,模式,设计模式
From: https://www.cnblogs.com/walkWithJoy/p/18352364

相关文章

  • 设计模式——单例设计模式
    单例设计模式如果你想创建一个类而且它在任何时刻只会有一个对象,那么你就应该使用单例类模式。此模式保证某个类在运行期间,只有一个实例对外提供服务,而这个类被称为单例类。懒汉式:只有调用getInstance方法时才创建对象.使用synchronized同步锁来保证防止多个线程同时调......
  • 工厂模式与策略模式的区别及其在Java中的应用
    工厂模式与策略模式的区别及其在Java中的应用1.引言在软件开发中,设计模式被广泛应用于解决各种常见问题,提高代码的可维护性、可扩展性和可读性。工厂模式(FactoryPattern)和策略模式(StrategyPattern)是两种非常重要的设计模式,它们解决了不同的设计问题,并且在许多情况下可......
  • Java设计模式:中介者模式详解与最佳实践
    Java设计模式:中介者模式详解与最佳实践1.引言在软件开发过程中,特别是复杂系统的构建中,模块间的交互往往成为影响代码质量的重要因素。当模块之间耦合度过高时,系统的维护、扩展和理解成本都会显著增加。为了降低模块之间的耦合度,保持系统的灵活性和可维护性,我们可以使用设......
  • 【攻防系列】揭秘黑客如何绕过EDR/XDR系统及应对策略
    在面对日益复杂的网络威胁时,许多企业依赖端点检测与响应和扩展检测与响应系统,然而,全球调查表明,黑客们越来越善于规避这些防御系统,给企业带来巨大挑战。本文深入分析了攻击者绕过端点检测与响应和扩展检测与响应系统的三大关键环节——观察、检测和响应,并提供了详细的应对策略。......
  • [设计模式]工厂模式
    简单工厂//计算类的基类@Setter@GetterpublicabstractclassOperation{privatedoublevalue1=0;privatedoublevalue2=0;protectedabstractdoublegetResule();}//加法publicclassOperationAddextendsOperation{@Overrideprote......
  • 工厂模式【简单工厂工厂方法抽象工厂】
    简单工厂:将对象的创建封装在子类当中,客户不需要去手动创建对象,只需要调用一些接口传递不同的类型参数来创建对象。但是在一个工厂里存在多种产品,会导致工厂的频繁修改工厂方法:实现了不同的产品存在于不同的工厂,使其解耦抽象工厂:实现了不同的工厂里面不止一种产品 简单......
  • [设计模式]单例模式
    单例模式懒汉式,线程不安全publicclassSingleton{privatestaticSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){instance=newSingleton();}......
  • Rust实现构建器模式和使用Bon库中的构建器
    实现构建器模式的一种方式这里参考资料2的文章,修改部分代码后如下。这段代码的目的是使用构建器模式创建和初始化Person对象。以下是各部分的解释:结构体定义Person:定义了一个结构体,包含name、age、address和sex四个字段。address和sex是可选的PersonBuilder:用于逐步构......
  • [设计模式]装饰者模式
    抽象构件publicabstractclassFastFood{publicStringdesc;publicintprice;publicabstractStringgetDesc();publicabstractintgetPrice();}具体构件米饭publicclassRiceextendsFastFood{publicRice(){this.desc......
  • “斯诺克”不等于“台球”-《分析模式》漫谈17
    DDD领域驱动设计批评文集做强化自测题获得“软件方法建模师”称号《软件方法》各章合集“AnalysisPatterns”的第一章有这么一句:Considersomeonewhowantstowritesoftwaretosimulatea game of snooker. 2004(机械工业出版社)中译本的译文为: game翻译成“游......