设计模式-行为型-策略模式

行为型设计模式-策略模式

一个不正经的程序员,学的不正经的设计模式,写的不正经的博客,做的不正经的分享系列。
(不定期更新设计模式分享第一篇章)

一、概念 Strategy [ˈstrætədʒi] :策略;计策;行动计划;策划;规划;部署;统筹安排;战略;战略部署

1.What

定义一系列算法, 将算法类进行封装, 以使算法的对象能够相互替换,而不互相影响。

在这里插入图片描述

2.Why

解决if-else或switch带来的算法臃肿问题,不能代替if-else或switch

3.Where

a.	针对同一操作的多种处理方式
b.	需要自由切换算法
c.	屏蔽算法执行规则的场景

4.How

三种角色
上下文(Context)控制策略上下文环境,隔离客户端与策略类的耦合关系
抽象策略(IStrategy):定义策略和算法的行为
具体策略(StrategyCaseA,StrategyCaseB….):具体执行算法及函数

示例:基于策略模式实现计算器,实现二维运算

二、基于策略模式实现计算器

1.定义算法抽象接口

代码如下(示例):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Strategy.Demo
{
    public interface IStrategy
    {
        /// <summary>
        /// 计算
        /// </summary>
        /// <param name="num1"></param>
        /// <param name="num2"></param>
        /// <returns></returns>
        int DoCalculationa(int num1, int num2);
    }
}

2.策略算法实现类

代码如下(示例):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Strategy.Demo
{
    /// <summary>
    /// 策略算法实现类
    /// </summary>
    public class CaseSum : IStrategy
    {
        public int DoCalculationa(int num1, int num2)
        {
            return num1 + num2;
        }
    }
    /// <summary>
    /// 策略算法实现类
    /// </summary>
    public class CaseSubtraction : IStrategy
    {
        public int DoCalculationa(int num1, int num2)
        {
            return num1 - num2;
        }
    }
    /// <summary>
    /// 策略算法实现类
    /// </summary>
    public class Casemultiplication : IStrategy
    {
        public int DoCalculationa(int num1, int num2)
        {
            return num1 * num2;
        }
    }
    /// <summary>
    /// 策略算法实现类
    /// </summary>
    public class Casedivision : IStrategy
    {
        public int DoCalculationa(int num1, int num2)
        {
            return num1 / num2;
        }
    }
    /// <summary>
    /// 策略算法实现类
    /// </summary>
    public class Casesurplus : IStrategy
    {
        public int DoCalculationa(int num1, int num2)
        {
            return num1 % num2;
        }
    }
}

3.策略调度器

代码如下(示例):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Strategy.Demo
{
    /// <summary>
    /// 策略调度器
    /// </summary>
    public class StrategyContext
    {
        private IStrategy strategy { get; set; }
        public void calculation(int num1, int num2, char calculation)
        {
            switch (calculation)
            {
                case '+':
                    strategy = new CaseSum();
                    break;
                case '-':
                    strategy = new CaseSubtraction();
                    break;
                case '*':
                    strategy = new Casemultiplication();
                    break;
                case '/':
                    strategy = new Casedivision();
                    break;
                case '%':
                    strategy = new Casesurplus();
                    break;
            }
            var result = strategy.DoCalculationa(num1, num2);
            Console.WriteLine($"计算结果是:{num1}{calculation}{num2}={result}");

        }


    }
}


3.Client应用

代码如下(示例):

var cal = new StrategyContext();
cal.calculation(9, 4, '+');
cal.calculation(9, 4, '-');
cal.calculation(9, 4, '*');
cal.calculation(9, 4, '/');
cal.calculation(9, 4, '%');


总结

策略模式应用比较广泛,并且之前总是在不经意间会使用到,但应用的并不是特别规范,使用策略模式可以有效的改善代码环境,减少判断体代码的臃肿,使代码易于维护。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

kenny@chen

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值