+ -
当前位置:首页 → 问答吧 → 【一天一个设计模式】04- 策略模式

【一天一个设计模式】04- 策略模式

时间:2008-11-10

来源:互联网

策略模式(Strategy),将不同情况的算法分拆到不同的类(比如advanceDiscountor类),然后调用者(discountor类)根据具体的情况,用算法类的对象来处理。

例子1

<? php
//打折接口
interface IDiscountor
{
    public function getDiscount();
}
------------------------------------------------------------------------------------
//普通用户打折类
class commonDiscountor implements IDiscountor
{
    public function getDiscount()
    {
        $discount = 1;
        return $discount;
    }
}
//高级用户打折类
class advanceDiscountor implements IDiscountor
{
    public function getDiscount()
    {
        $discount = 0.9;
        return $discount;
    }
}
//vip用户打折类
class vipDiscountor implements IDiscountor
{
    public function getDiscount()
    {
        $discount = 0.8;
        return $discount;
    }
}
----------------------------------------------------------------------------------
//打折类
class discountor
{
    public function getDiscount($rank)
    {
        switch ($rank) {
        case 'common':
            $discountor = new commonDiscountor();
            break;
        case 'advance':
            $discountor = new advanceDiscountor();
            break;
        case 'vip':
            $discountor = new vipDiscountor();
            break;
        }
        return $discountor->getDiscount();
    }

}
$discountor = new discountor();
echo $discountor->getDiscount('advance');
?>

例子2
/**
* 定义支持算法的接口
*
*/
abstract class Strategy
{
    abstract public function AlgorithmInterface();
}

--------------------------------------------------------------------------------

class ConcreateStratA extends Strategy
{
    public function AlgorithmInterface()
    {
        echo "算法A";
    }
}

class ConcreateStratB extends Strategy
{
    public function AlgorithmInterface()
    {
        echo "算法B";
    }
}


class ConcreateStratC extends Strategy
{
    public function AlgorithmInterface()
    {
        echo "算法C";
    }
}

--------------------------------------------------------------------------------

class Context
{
    private $_StrObj;
   
    public function __construct($strobj)
    {
        $this->_StrObj = $strobj;
    }
   
    public function ContextInterface()
    {
        $this->_StrObj->AlgorithmInterface();
    }
}

--------------------------------------------------------------------------------

$context = new Context(new ConcreateStratA);
$context->ContextInterface();
$context = new Context(new ConcreateStratC);
$context->ContextInterface();
$context = new Context(new ConcreateStratB);
$context->ContextInterface();

作者: kakashilw   发布时间: 2008-11-10

我怎么觉得这是工厂模式呢?

作者: zwws   发布时间: 2008-11-11