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

【设计模式之策略模式】

时间:2022-10-17 18:04:52浏览次数:34  
标签:策略 void 模式 Strategy 算法 context Context 设计模式


前言:


最近在学习设计模式,简单工厂是接触的第一个模式,后来,就遇到了策略模式,策略模式真是有谋略啊!定义了算法家族,有了算法家族,再难的计算都不在话下了!!!今天,我们一起来学习策略模式,看看这是一个怎样的设计模式?


中心:

(一)定义

官方:


它定义了算法家族,分别封装起来起来,让他们之间可以相互替代,此模式让算法的变化,不会影响到使用算法的用户。


个人理解:


定义了一系列的算法,将算法封装在独立的策略类中,既然独立,就可以相互替代,所有的算法完成的是相同的工作,只是实现不同,它以相同的方式调用所有的算法。


相比继承的优点:


继承提供了一种支持多种算法或行为的方法,而继承使得算法父类与子类混合,难以理解、维护、和扩展,还不同的动态的改变算法,这是继承的缺点,正是策略模式的优点。使用策略模式,使得易于切换、理解、和扩展。


(二)结构图

UML图:


【设计模式之策略模式】_ide


例子:

以商场打折为例,可用下图来理解策略模式。


【设计模式之策略模式】_策略模式_02


(三)主要代码


Strategy类,定义所有支持的算法的公共接口


<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">//抽象算法类
abstract class Strategy
{
//算法方法
public abstract void AlgorithmInterface();
}</span></span></span>

ConcreteStrategy,封装了具体的算法或行为,继承于Strategy

<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"> //具体算法A
class ConcreteStrategyA:Strategy
{
//算法A实现方法
public override void AlgorithmInterface()
{
Console.WriteLine("算法A实现");
}
}
//具体算法B
class ConcreteStrategyB : Strategy
{
//算法b实现方法
public override void AlgorithmInterface()
{
Console.WriteLine("算法B实现");
}
}
//具体算法C
class ConcreteStrategyC : Strategy
{
//算法A实现方法
public override void AlgorithmInterface()
{
Console.WriteLine("算法C实现");
}
}</span></span></span>

Context,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用

<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"> //上下文
class Context
{
Strategy strategy;
public Context (Strategy strategy)
{
this.strategy = strategy;
}
//上下文接口
public void ContextInterface()
{
strategy.AlgorithmInterface();
}
}</span></span></span>

客户端代码

<span style="font-size:18px;"><span style="font-size:18px;"> <span style="font-size:18px;">static void Main(string[] args)
{
Context context;
context = new Context(new ConcreteStrategyA());
context.ContextInterface();

context = new Context(new ConcreteStrategyB());
context.ContextInterface();

context = new Context(new ConcreteStrategyC());
context.ContextInterface();

Console.Read();
}</span></span></span>




(四)定位


策略模式,从字面可以理解“出谋划策”,是一种行为,故属于行为型模式。


(五)优缺点


优点:减少耦合,简化测试(单元测试)


缺点:客户端知道所有的类,任务重, 造成很多策略类


(六)何时用


1. 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为

2. 一个系统的算法使用的数据不可以让客户端知道。

3. 如果一个对象有很多的行为,




在实践中,只要分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式。


总结:


策略模式,你懂了吗?希望这篇博客,对大家有用!

标签:策略,void,模式,Strategy,算法,context,Context,设计模式
From: https://blog.51cto.com/u_15586641/5763786

相关文章

  • 12-Go设计模式-观察模式
    观察模式样例代码/*观察者模式观察者模式是用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应。在观察者模式中,发生......
  • 你还在写垃圾代码?快用 Java 8 重构传统设计模式吧,是真的优雅!
    来源:https://www.cnblogs.com/yjmyzz/p/refactor-design-pattern-using-java8.htmljava8中提供的很多新特性可以用来重构传统设计模式中的写法,下面是一些示例:一、策略模......
  • 10-Go设计模式-命令模式
    命令模式样例代码/*命令模式将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种......
  • Flink集群部署-standalone部署模式
    简单研究下Flink的任务部署。我们在IDEA开发工具中用代码跑Flink的时候,实际是会虚拟出一个小型的Flink集群,当执行execute的时候是将上面的代码作为一个job提交到Fl......
  • LFM Oversea 每周策略晨报 2022-10-17
    盘面数据 国庆后上证指数下穿3000 点,随后迎来连续上涨,上周上证指数上涨1.57%,深证成指上涨3.18%,创业板指数上涨6.35%。上周A 股日均成交额6982亿元,较上周环比+......
  • Winform 窗体重命名(改名)后,设计模式对窗体的任何修改都无效,执行结果为改名前的窗体(一个
    (如图)1.新建Winform窗体应用程序  2.窗体设计器不关闭,直接改名 3.设计窗体 4.运行程序,结果(窗体空白) 5.解决方案   5.1丢弃设计,直接关闭设计窗体,重新......
  • Tutorial 3_工厂方法模式
    [实验任务一]:加密算法目前常用的加密算法有DES(DataEncryptionStandard)和IDEA(InternationalDataEncryptionAlgorithm)国际数据加密算法等,请用工厂方法实现加密算法系统......
  • Tutorial 4_抽象工厂工厂模式
    [实验任务一]:人与肤色使用抽象工厂模式,完成下述产品等级结构: 2.1Man.javapackagechouxiang;/**抽象产品类Man*/publicinterfaceMan{publicvoi......
  • Tutorial 5_建造者模式
    [实验任务一]:计算机组装使用建造者模式,完成下述任务:计算机组装工厂可以将CPU、内存、硬盘、主机等硬件设备组装在一起构成计算机,计算机的类型可以是笔记本,也可以是台式机......
  • Java_SE_Lesson_3:接口、单例模式、包与访问控制
    接口中所声明的方法都是抽象方法。接口中的方法都是public​的。接口中也可以定义成员变量。接口中的成员变量都是public,final,static的。一个类不能既是f......