C#-设计模式-策略模式

1.定义

将会经常改变的算法,封装在接口中,在算法更改时,只需要为接口添加新的实现,而不需要修改原有的算法。

2.代码实现

public interface Calculatable
{
    decimal GetResult(decimal num1, decimal num2);
}

public class Add : Calculatable
{
    public decimal GetResult(decimal num1, decimal num2)
    {
        return num1 + num2;
    }
}

public class Reduce : Calculatable
{
    public decimal GetResult(decimal num1, decimal num2)
    {
        return num1 - num2;
    }
}

public class Multiplication : Calculatable
{
    public decimal GetResult(decimal num1, decimal num2)
    {
        return num1 * num2;
    }
}

public class Division : Calculatable
{
    public decimal GetResult(decimal num1, decimal num2)
    {
        if (num2 == 0) return 0;
        return num1 / num2;
    }
}

由一个计算接口,派生出4个运算类,分别是加减乘除,调用的时候;

Calculatable cal = new Add();
cal.GetResult(1, 2);

当需要更换算法的时候只需要将接口的实现换成另一个算法类即可,如果使用IOC,还可以将实现放到配置文件中,起到动态更换算法的功能。

3.特点

优点:将算法的变化进行抽离和封装,因此当算法更换时,不需要更改代码,只需要对接口进行新的实现就行了

缺点:如果算法比较多的时候,策略类(实现策略接口的类)就会比较多,而且比较坑爹的是,每一个策略类中只有一个public方法,比较浪费

如果优化的话,可以使用抽象类,将变化的算法设为抽象方法,或虚方法,这样让子类对该方法进行实现即可,同样可以实现该需求,而且代码重用性应该会更好