【设计模式】CSharp实现行为型模式之-策略模式

感谢 TurboAI对本博客的的大力赞助。 创作不易,如果您觉得有帮助,请 支持LIncol29! 为了让我能够继续创作更好的内容,你也可以选择订阅博客的 VIP ,包年VIP仅需10元/年,所有VIP内容免费观看

前言

策略模式应对业务处理中,会有多种相似处理方式(算法),然后封装成算法+抽象,此外,调用环节也有扩展要求的,需要context(上下文)

好处:算法封装,有抽象可以扩展;调用环节转移,可以扩展;

缺陷:上端必须知道全部算法,而且知道映射关系

包一层:没有什么技术问题是包一层不能解决的,如果有,再包一层

中间层,转移调用,核心意义就在于调用环节可以扩展

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

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

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

使用场景

在需要根据不同情况采取不同算法或策略时使用较多,例如支付方式选择、排序算法、保存为不同文件、计算器运算等。

使用接口方法实现策略模式(推荐)

使用例子:保存不同类型文件

1、定义接口,有个方法 Save

2、定义三个类(保存不同的文件)比如.pdf.txt 。实现接口的方法Save

3、定义一个Context类,两个方法。1.调用抽象类的实现子类 2.调用Save方法

4、实例化Context类,调用他的两个方法。

完整代码实现

//使用接口方法实现策略模式
public class Strategy_interface
{
    public interface IStrategy
    {
        void Save();
    }
    //策略类 PDF
    public class ConvertPDF : IStrategy
    {
        public void Save()
        {
            Console.WriteLine("已被转换为PDF!");
        }
    }
    //策略类 TXT
    public class ConvertTXT : IStrategy
    {
        public void Save()
        {
            Console.WriteLine("已被转换为TXT!");
        }
    }
    //上下文环境
    public class DataContext
    {
        private IStrategy strategy = null;
        public void SetStartegy(IStrategy strategy)
        {
            this.strategy = strategy;
        }
        public void ExecuteSave()
        {
            strategy.Save();
        }
    }
    static void Main()
    {
        DataContext dataContext = new DataContext();
        dataContext.SetStartegy(new ConvertPDF());
        dataContext.ExecuteSave();

        dataContext.SetStartegy(new ConvertTXT());
        dataContext.ExecuteSave();

        Console.ReadKey();
    }
}

使用委托实现策略模式

可以使用Fun<>或者Action<>,也可以使用自定义委托。根据项目需求自定义。

下述代码实现Fun<>传入一个参数去实现,在实际使用过程中,传递参数的需求是常见形式。

完整代码实现

//使用Fun<> 或 Action<> 委托
public class Strategy_delegate
{
    //int,int参数,最后一个为out 属于int类型
    private Func<int, int, int> _strategy;

    public void SetStrategy(Func<int, int, int> strategy) { _strategy = strategy; }

    public int Execute(int x,int y)
    {
        return _strategy(x,y);
    }

    static void Main()
    {
        Strategy_delegate _Delegate = new Strategy_delegate();

        //加法策略
        _Delegate.SetStrategy((x, y) => x + y);
        Console.WriteLine("加法运算,值为:" + _Delegate.Execute(1, 5));

        //减法策略
        _Delegate.SetStrategy((x, y) => x - y);
        Console.WriteLine("减法运算,值为:" + _Delegate.Execute(7, 5));

        Console.ReadKey();
    }
}

拓展:在创建不同的策略对象的时候,可以使用简单工厂 + 反射 + 配置文件的方式创建

文章拓展资料

创作不易,如果您觉得有帮助,请支持LIncol29!
如有需要,请至网站地图学习本博客的教程
博客订阅:通过RSS或关注公众号[Lincol的编程世界] | 广告招租与合作请留言
本文链接:https://www.lincol29.cn/strategypattern
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0协议转载请注明文章地址及作者哦~
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇