策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户端。
在实践中,只要听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理。
下面用完成加法和减法的需求来看一下基本思路。
首先定义算法公共接口 Strategy:
//算法抽象类
public abstract class Strategy
{
public abstract void AlgorithmInterface(double a, double b);
}
定义具体的算法或行为:
//加法算法类
public class ConcreteStrategyAdd : Strategy
{
private double a, b;
public ConcreteStrategyAdd()
{
//初始化的时候可以对算法进行相应设置
}
public override double AlgorithmInterface(double a, double b)
{
return a + b;
}
}
//减法算法类
public class ConcreteStrategySub : Strategy
{
private double a, b;
public ConcreteStrategySub()
{
}
public override double AlgorithmInterface(double a, double b)
{
return a - b;
}
}
利用工厂模式生成算法策略的管理类 Context:
public class Context
{
private Strategy strategy;
//初始化拿到具体的算法模块
public Context(char type)
{
switch (type)
{
case '+':
this.strategy = new ConcreteStrategyAdd();
break;
case '-':
this.strategy = new ConcreteStrategySub();
break;
}
}
//调用该算法进行相应计算
public void ContextInterface(double a, double b)
{
strategy.AlgorithmInterface(a, b);
}
}
客户端调用:
public class Main
{
public void compute()
{
Context ct = new Context('+');
ct.ContextInterface(1, 1);
Context ct1 = new Context('-');
ct1.ContextInterface(1, 1);
}
}
至此,各个具体算法模块互相分离,修改某个算法就只需更改对应模块,新增只需新加算法模块去继承Strategy,而且管理类将算法模块与客户端彻底分离开,减少耦合性。
下期讲解——装饰模式