【23种设计模式】之策略模式(Strategy Pattern) .Net Core实现

128 篇文章 7 订阅

简介

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。

何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。

如何解决:将这些算法封装成一个一个的类,任意地替换。

关键代码:实现同一个接口。

应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。

优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

在这里插入图片描述
我们定义一个接口或抽象类Strategy,并设计其接口,由具体的实现类实现不同的算法,这里是ConcreteStrategy1和2类。

Client就是一个使用者,其内部可以实例化Strategy类,也可以按照条件进行配置不同的Strategy类,具体的应用方法通过接口或抽象类进行调用,而避免直接选定具体的类。

dotnet core 源码赏析

在 aspnet Core源代码内有一个验证策略的接口IValidationStrategy,采用了策略模式。

public interface IValidationStrategy
    {       
        IEnumerator<ValidationEntry> GetChildren(ModelMetadata metadata, string key, object model);
    }
    internal class DefaultComplexObjectValidationStrategy : IValidationStrategy
    {

        public static readonly IValidationStrategy Instance = new DefaultComplexObjectValidationStrategy();

        private DefaultComplexObjectValidationStrategy()
        {
        }

        /// <inheritdoc />
        public IEnumerator<ValidationEntry> GetChildren(
            ModelMetadata metadata,
            string key,
            object model)
        {
            return new Enumerator(metadata, key, model);
        }

        
        }
  }

代理类实现

这是一个例子,我们来按照uml图的设计实现一个策略类,接口定义如下:

public abstract class Strategy
    {
        public abstract void AlgorithmInterface();
    }    
    public class ConcreteStrategyA : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine(
                "Called ConcreteStrategyA.AlgorithmInterface()");
        }
    }   
    public class ConcreteStrategyB : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine(
                "Called ConcreteStrategyB.AlgorithmInterface()");
        }
    }
    public class Client
    {
        Strategy strategy;
        // Constructor
        public Client(Strategy strategy)
        {
            this.strategy = strategy;
        }
        public void ContextInterface()
        {
            strategy.AlgorithmInterface();
        }
    }

调用方,可以按照下列方式直接使用。

Client context;
// Two contexts following different strategies
context = new Client(new ConcreteStrategyA());
context.ContextInterface();
context = new Client(new ConcreteStrategyB());
context.ContextInterface();

通过上述的策略类,我们可以在客户端代码内,随意切换策略实现类,实现互换的目的,当然如果引入配置信息,还可以做到根据配置信息动态修改算法的功能。

来源

策略模式-菜鸟教程
.Net 设计模式进阶之路——策略模式[Strategy]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
设计模式是软件开发中常用的解决问题的可复用方案,Gang of Four(GoF)提出了 23 种经典的设计模式,分为创建型模式、结构型模式和行为型模式。下面是这些设计模式的简要介绍以及代码示例: 1. 创建型模式: - 工厂方法模式(Factory Method):定义一个创建对象的接口,由子类决定实例化哪个类。 - 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 - 单例模式(Singleton):保证一个类只有一个实例,并提供一个全局访问点。 - 原型模式(Prototype):通过复制现有对象来创建新对象。 2. 结构型模式: - 适配器模式(Adapter):将一个类的接口转换成客户希望的另一个接口。 - 桥接模式(Bridge):将抽象部分与它的实现部分分离,使它们可以独立地变化。 - 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。 - 装饰者模式(Decorator):动态地给对象添加额外的职责。 - 外观模式(Facade):为子系统中的一组接口提供一个统一的接口。 - 享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象。 3. 行为型模式: - 模板方法模式(Template Method):定义一个算法的骨架,将一些步骤延迟到子类中实现。 - 命令模式(Command):将请求封装为一个对象,使得可以用不同的请求对客户进行参数化。 - 迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中的各个元素。 - 观察者模式(Observer):定义对象间的一种一对多的依赖关系,使得当一个对象改变状态时,所有依赖它的对象都会被通知并自动更新。 - 中介者模式(Mediator):用一个中介对象来封装一系列的对象交互。 - 备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 - 解释器模式(Interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器来解释该语言中的句子。 - 状态模式(State):允许一个对象在其内部状态改变时改变它的行为。 - 策略模式Strategy):定义一系列的算法,将每个算法封装起来,并使它们可以相互替换。 - 职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 以上只是对这些设计模式的简要介绍,每种设计模式都有更详细的实现细节和应用场景。具体的代码实现可以参考相关的教程和书籍,或者在开发中搜索具体的设计模式实现案例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

软泡芙

给爷鞠躬!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值