略模模式是定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
自己对这句话的理解是,针对一个问题,在不同环境下,根据实际情况,所得出解决的方式不同。我们将这些解决的方式,每一个都封装起来。根据外部因素,进行选择性使用。
下面举一个超市购物的例子来理解策略模式的好处。
假如说,到超市购物,平常时间,在超市结账时都是,买了多少钱的东西,就应该付多少钱。而现在正好赶上五一劳动节,超市经理想搞一个打折活动进行促销,这是商场的收银系统就满足不了超市的需求了,那怎么办呢?改代码吗?这样太麻烦了,如果促销时间过了,不打折了,我们难道还得将原来改动的代码在改回来吗?还有如果经理还想进行返利的促销活动的话,那样还得去改动代码?这样来回的改动代码?不仅不方便,还容易出现错误,并且这违背了设计模式的开放封闭原则。那要怎样才不违反开放封闭原则呢?那就要用到我开头写道策略模式。
现在超市不是有3种结账的方式吗?他们都是做结账的事,那么我们就可以将他们共同点结账进行抽象,建立一个结账的抽象类,然后用这三种方式去继承它。如下图。
图中的Context是根据传递进来的参数,来选择具体的策略模式。
代码:
<span style="font-size:18px;">namespace ConsoleApplication1
{
class Program
{
//客户端
static void Main(string[] args)
{
Context context;
context = new Context(new checkoutStartegeA());
context.ContextInterface();
context = new Context(new checkoutStartegeB());
context.ContextInterface();
context = new Context(new checkoutStartegeC());
context.ContextInterface();
Console.Read();
}
}
//抽象类
abstract class CheckOutStartegy
{
//抽象结账算法
public abstract void checkoutInterface();
}
//具体实现
class checkoutStartegeA : CheckOutStartegy {
//正常收费
public override void checkoutInterface()
{
Console.WriteLine("正常收费");
}
}
class checkoutStartegeB : CheckOutStartegy
{
//正常收费
public override void checkoutInterface()
{
Console.WriteLine("返利收费");
}
}
class checkoutStartegeC : CheckOutStartegy
{
//正常收费
public override void checkoutInterface()
{
Console.WriteLine("打折收费");
}
}
class Context {
CheckOutStartegy checkoutstartegy;
//初始策略
public Context(CheckOutStartegy checkoutstartegy) {
this.checkoutstartegy = checkoutstartegy;
}
//根据上下文接口
public void ContextInterface() {
checkoutstartegy.checkoutInterface();
}
}
}
</span>
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性,同时他能降低代码的冗余,方便了后期的维护操作。