php中策略模式,PHP 策略模式

策略模式是一种设计模式,用于封装算法和行为,使得算法的变化不会影响到使用算法的客户端。通过创建一系列具体策略类并继承抽象策略类,实现策略的互换。在实际应用中,策略模式常与简单工厂模式结合使用,以减少客户端对具体策略类的依赖。上下文类Context负责调用策略对象的方法,而客户端只需传入策略类型即可执行相应算法。这种模式简化了单元测试,提高了代码的可扩展性和可维护性。
摘要由CSDN通过智能技术生成

策略模式(Strategy):它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。事实上你可以将一个继承自抽象策略类的称为具体策略,就是策略模式中的策略1,策略2......

策略模式的优点:

策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法的公共功能。策略模式的另一个优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。

说了这么多,策略模式究竟解决的是什么问题呢?

策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。

在基本策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。

策略模式的结构图:

e17bc60da5321b4ac2aa9d3950679691.png

策略模式的具体实现代码示例:

namespace 策略模式

{

public class Program

{

static void Main(string[] args)

{

Console.WriteLine("我钓了一条鱼,应该怎么煮呢?");

Context context;

context = new Context(new ConcreteStrategyA());  //客户端依赖具体实现类了

context.RunMethod();

context = new Context(new ConcreteStrategyB());

context.RunMethod();

Console.ReadKey();

}

}

//抽象算法类

public abstract class Strategy

{

//算法方法

public abstract void AlgorithmInterface();

}

//具体策略1

public class ConcreteStrategyA : Strategy

{

public override void AlgorithmInterface()

{

Console.WriteLine("加水、上蒸笼、开火、清蒸!");

}

}

//具体策略2

public class ConcreteStrategyB : Strategy

{

public override void AlgorithmInterface()

{

Console.WriteLine("热锅、放油、红烧!");

}

}

//上下文

public class Context

{

Strategy strategy;

//构造方法接收具体对象

public Context(Strategy strategy)

{

this.strategy = strategy;

}

//调用方法

public void RunMethod()

{

strategy.AlgorithmInterface();

}

}

}

复制代码

以上代码感觉到了什么?策略模式不管创建,它做的事非常少,少到什么程度?

你传个对象给我,我帮你调用这个对象的方法(这个工作主要通过Context来维护),我不管你这对象怎么创建,但你得给我个对象。策略模式不管对象的创建,那么它实质上是什么。用类图说明。

b6bfe0383df4a6a9276d5344252a60d3.png

从上面的类图看到一个问题。因为,我调用你时,我要给你传个对象,上面的例子直接new()。因此,客户端依赖于具体实现类了。

所以,策略模式通常与一些创建对象的模式混合使用,比如负责维护调用具体策略的Context类搭配个简单工厂:

public class Context

{

Strategy strategy = null;

//调用方法

public void RunMethod(string type)

{

switch (type)

{

default:

case "清蒸":

strategy = new ConcreteStrategyA();

break;

case "红烧":

strategy = new ConcreteStrategyB();

break;

}

strategy.AlgorithmInterface();

}

}

复制代码

这样外部就依赖Context类了:

static void Main(string[] args)

{

Console.WriteLine("我钓了一条鱼,应该怎么煮呢?");

Context context = new Context();

context.RunMethod("清蒸");

context.RunMethod("红烧");

Console.ReadKey();

}

复制代码

最后回顾一下:

策略模式不管对象创建,它的目的在于封装不同的算法,根据传入的对象,调用具体的策略方法,在上面的示例程序加入简单工厂模式的原因,是因为要创建对应的具体类,要分清哪些代码属于哪个模式的范畴。

搞了半天,策略模式就是一个类封装一个算法,实现一个算法接口,然后搞个Context来调用这些算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值