1. 策略模式简介
策略模式是一种行为设计模式,它定义了一组算法,将每个算法都封装起来,以便能够互换使用。策略模式让算法的变化独立于使用它的客户端。
2. 策略模式的角色
2.1 上下文(Context)
上下文是客户端与策略对象之间的桥梁,它负责传递客户端所需要的数据给策略对象,并调用策略对象中的算法进行处理。
2.2 抽象策略(Strategy)
抽象策略是策略模式中的核心接口,它定义了一组算法接口,同时它也是所有具体策略类的父类。
2.3 具体策略(ConcreteStrategy)
具体策略是策略模式中的具体算法实现,它实现了策略接口,具体算法由具体策略来实现。
3. 策略模式的案例分享
现在,我们通过一个简单的案例来深入理解策略模式的应用。
3.1 案例背景
小明是一名烘焙师,他的店铺专门制作各类美食甜点。他需要在不同的状态下制作不同口感的甜点。例如,做某种甜点时,当温度低于60℃时需要添加一种配料,而当温度高于60℃时需要添加另一种配料。小明现在想要使用策略模式来实现这个功能,以便随时能够更换新的配料。
3.2 解决方案
根据上述问题,我们可以将甜点和配料的添加分别定义为两个具体策略,然后在小明的甜点制作过程中,根据温度的不同使用不同的配料策略。
//抽象策略
interface IIngredientsStrategy
{
void AddIngredients();
}
//具体策略1
class IngredientsStrategy1 : IIngredientsStrategy
{
public void AddIngredients()
{
Console.WriteLine("添加配料1");
}
}
//具体策略2
class IngredientsStrategy2 : IIngredientsStrategy
{
public void AddIngredients()
{
Console.WriteLine("添加配料2");
}
}
//上下文
class Dessert
{
private IIngredientsStrategy _ingredientsStrategy;
public Dessert(IIngredientsStrategy strategy)
{
this._ingredientsStrategy = strategy;
}
//设置策略
public void SetStrategy(IIngredientsStrategy strategy)
{
this._ingredientsStrategy = strategy;
}
//添加配料
public void AddIngredients()
{
_ingredientsStrategy.AddIngredients();
}
}
在上述代码中,IIngredientsStrategy接口即为抽象策略,它包含了一个添加配料的方法。然后,我们根据具体的配料类型定义了两个具体策略类:IngredientsStrategy1和 IngredientsStrategy2。最后,我们将甜点定义为上下文,它包含了一个策略,并在需要添加配料时调用策略类的方法。
3.3 测试代码
static void Main()
{
Dessert dessert = new Dessert(new IngredientsStrategy1());
//当温度小于60度时添加配料1
dessert.AddIngredients();
dessert.SetStrategy(new IngredientsStrategy2());
//当温度大于等于60度时添加配料2
dessert.AddIngredients();
}
在此,我们使用了策略模式来解决了小明的问题,他现在能够在不同的状态下轻松更换配料的类型。
4. 总结
策略模式是一种非常常用的设计模式,它将算法的变化独立于使用算法的客户端,从而降低了各个类之间的耦合度。在实际开发中,我们经常会遇到需要使用不同算法的情况,这时候就可以使用策略模式来灵活的处理多种情况。