php设计模式之 策略模式

策略模式:义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。是一种行为模式。

策略模式包含三种角色

1 抽象策略角色: 策略类,通常由一个接口或者抽象类实现。

2 具体策略角色:包装了相关的算法和行为。

3 环境角色:持有一个策略类的引用,最终给客户端调用。

举个例子:有多种排序的方法,我可以写一个排序类,每一种排序算法写一个方法,客户端调用时,知道每一种方法即可。但是新增一种算法时,或者某一种算法重写,必须修改这个算法类。当这个算法类很大时,变得难以维护了。

 策略模式把对象本身(配置类)和算法类(具体算法类)区分开来。这样算法类的修改,新增,不关系到其他类的修改,只是用户可以自行替换算法。

UML类图如下

<?php

/*

 * 策略模式:定义一系列算法,并且把每一个算法封装起来,并且使它们可以相互替换

 * 策略模式使得算法可以独立于使用它的客户而变化

 */





//抽象策略接口,完成某件事情

interface category{

    public function dosomething();

}



//具体算法类,实现具体的事情

class category_a implements category{

    public function dosomething(){

        echo 'do A';

    }

}



class category_b implements category{

    public function dosomething(){

        echo 'do B';

    }

}



class category_c implements category{

    public function dosomething(){

        echo 'do C';

    }

}



//配置类,使用抽象策略接口来配置

class context{

    public $cg;

     

    public function __construct(category $a){

        $this->cg = $a;

    }

     

    public function dodo(){

        return $this->cg->dosomething();//同一方法作用于不同类的对象,产生不同的结果,这在php中就是多态

    }

}



//客户端调用,由客户自己决定使用哪种策略,即客户自行实例化算法类。区别于简单工厂模式

//简单工厂模式是对象的创建模式,客户端不创建对象,只给出参数,由工厂方法来决定创建哪一个实例

//也就是说,简单工厂模式客户端只传参数,策略模式客户端传算法实例

$m = new context(new category_b());

$m->dodo();


现在我要增加一种算法,do D;我只需要新写一个类  上面实现了策略模式。
 

class category_d implements category{

    public function dosomething(){

        echo 'do D';

    }

}

客户端调用,替换成d就可以了

$m = new context(new category_b());

  区别于简单工厂模式(见简单工厂模式篇)。


?>

 

 

策略模式缺点:

 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。

 

 

当存在以下情况时使策略(Strategy)模式
1)• 许多相关的类仅仅是行为有异。 “策略”提供了一种用多个行为中的一个行为来配置一个类的方法。即一个系统需要动态地在几种算法中选择一种。
2)• 需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间 /时间权衡的算法。当这些变体实现为一个算法的类层次时 ,可以使用策略模式。
3)• 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
4)• 一个类定义了多种行为 , 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句

 

 

策略与工厂模式的区别  (工厂模式详解

https://blog.csdn.net/qq_31812703/article/details/94721700

 

总结简单工厂模式和策略模式
1.从类型上说:简单工厂模式属于创建型模式,而策略模式属于行为型模式。 
2.接下来,看一个小例子: 

 斧子有很多种,有一个工厂专门负责生产各种需求的斧子。

工厂模式: 
1)根据你给出的目的来生产不同用途的斧子,例如要砍人,那么工厂生产砍人斧子,要伐木就生产伐木斧子。 
2)即根据你给出一些属性来生产不同行为的一类对象返回给你。 
3)关注对象创建
策略模式: 
1)用工厂生产的斧子来做对应的事情,例如用砍人的斧子来砍人,用伐木的斧子来伐木。 
2)即根据你给出对应的对象来执行对应的方法。 
3)关注行为的选择
3.简单工厂模式:根据客户选择的条件,来帮客户创建一个对象。 
 策略模式:客户给它一个创建好的对象,它来帮客户做相应的事。
 

通过比较客户端的代码发现: 
  简单工厂模式:将对象的选择创建交给了简单工厂类,客户端只需要输入相应的条件就可以,不用负责对象的创建,但是需要客户端自己调用算法类的方法。但是一旦需要增加新的运算类,比如开根运算,就要去修改简单工厂类。 
  策略模式:对象的选择创建仍需要自己来做,但是将调用方法的职责交给了Context类。一旦需要增加新的策略需要修改客户端。

因此,简单工厂模式的缺点就是当有新的需求增加时,需要频繁的修改工厂类。只用策略模式,当有新的需求增加时需要修改的是客户端,客户端仍然承担着创建对象的职责,并没有减轻客户端的压力。而将这两种模式结合起来使用,则需要修改 Context 类,总之不是完美的。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值