【行为型设计模式】C#设计模式之策略模式

csharp 复制代码
题目:

假设你正在开发一个手机应用程序,该应用程序包含一个计算器功能。用户可以根据自己的需求选择不同的计算策略进行计算,例如加法、减法、乘法或除法。请使用策略模式设计该计算器功能,使得用户可以根据自己的选择进行相应的计算操作。

请描述如何使用策略模式来设计并实现该计算器功能,并简要说明策略模式的优点和适用场景。
csharp 复制代码
策略模式是一种行为型设计模式,它允许在运行时根据不同的情况选择不同的算法或行为。策略模式的主要作用是将算法的定义与使用相分离,提供了一种灵活的方式来管理和应用不同的算法。

策略模式的好处包括:

可扩展性:通过定义抽象的策略接口,可以随时添加新的具体策略类,而不需要修改现有代码。这使得系统更加灵活,容易扩展。

代码复用:使用策略模式可以将具体的算法封装到独立的策略类中,这样可以避免重复的代码逻辑,并提高代码的重用性。

可维护性:由于每个策略类都是独立的,所以对于每个具体的策略类进行单独的测试和维护是比较容易的。这样可以简化代码的维护过程。

解耦合:策略模式将算法的定义与使用相分离,使得客户端与具体策略类解耦,客户端只需要知道如何使用策略接口即可。这样可以减少类之间的依赖关系,提高代码的灵活性和可维护性。

动态切换算法:策略模式允许在运行时根据需要动态地切换算法,而不需要修改原有代码。这使得系统能够根据不同的情况或需求灵活地使用不同的算法,提高了系统的适应性和扩展性。

总的来说,策略模式提供了一种灵活、可扩展和可维护的方式来处理不同的算法或行为,并将其封装到独立的策略类中,使得系统更加灵活和易于维护。

参考代码:

csharp 复制代码
class Program 
{
    static void Main(string[] args) 
    {
        Calculator calculator = new Calculator();
        calculator.SetStrategy(new AdditionStrategy());
        Console.WriteLine("10 + 5 = " + calculator.ExecuteStrategy(10, 5));

        calculator.SetStrategy(new SubtractionStrategy());
        Console.WriteLine("10 - 5 = " + calculator.ExecuteStrategy(10, 5));

        calculator.SetStrategy(new MultiplicationStrategy());
        Console.WriteLine("10 * 5 = " + calculator.ExecuteStrategy(10, 5));

        calculator.SetStrategy(new DivisionStrategy());
        Console.WriteLine("10 / 5 = " + calculator.ExecuteStrategy(10, 5));

        Console.ReadLine();


    }
}


public interface ICalculatorStrategy 
{
  double Calculate(double num1, double num2);
}

public class AdditionStrategy : ICalculatorStrategy
{
    public double Calculate(double num1, double num2)
    {
       return num1 + num2;
    }
}


public class SubtractionStrategy : ICalculatorStrategy
{
    public double Calculate(double num1, double num2)
    {
        return num1 - num2;
    }
}

public class MultiplicationStrategy : ICalculatorStrategy
{
    public double Calculate(double num1, double num2)
    {
        return num1 * num2;
    }
}


public class DivisionStrategy : ICalculatorStrategy
{
    public double Calculate(double num1, double num2)
    {

        if (num2 != 0)
        {
            return num1 / num2;
        }
        else
        {
            throw new ArgumentException("除数不能为零!");
        }
    }
}


public class Calculator
{
    private ICalculatorStrategy? _calculatorStrategy;

    public void SetStrategy(ICalculatorStrategy calculatorStrategy)
    {
        _calculatorStrategy=calculatorStrategy;
    }

    public double ExecuteStrategy(double num1, double num2) 
    {
        if (_calculatorStrategy == null)
        {
            throw new InvalidOperationException("没有设置计算策略!");

        }
        return _calculatorStrategy.Calculate(num1, num2);
    }
}
相关推荐
码农君莫笑10 小时前
使用blazor开发信息管理系统的应用场景
数据库·信息可视化·c#·.net·visual studio
可喜~可乐12 小时前
C# WPF开发
microsoft·c#·wpf
666和77716 小时前
C#的单元测试
开发语言·单元测试·c#
小码编匠17 小时前
WPF 星空效果:创建逼真的宇宙背景
后端·c#·.net
lxyzcm17 小时前
深入理解C++23的Deducing this特性(上):基础概念与语法详解
开发语言·c++·spring boot·设计模式·c++23
越甲八千17 小时前
重温设计模式--单例模式
单例模式·设计模式
Vincent(朱志强)18 小时前
设计模式详解(十二):单例模式——Singleton
android·单例模式·设计模式
诸葛悠闲19 小时前
设计模式——桥接模式
设计模式·桥接模式
向宇it20 小时前
【从零开始入门unity游戏开发之——unity篇02】unity6基础入门——软件下载安装、Unity Hub配置、安装unity编辑器、许可证管理
开发语言·unity·c#·编辑器·游戏引擎
yngsqq20 小时前
一键打断线(根据相交点打断)——CAD c# 二次开发
windows·microsoft·c#