策略模式 (Strategy design pattern)

2020-12-18  本文已影响0人  lifefruity

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化,即封装变化的算法。
在这个例子中有move的一系列算法,和attack的一系列算法。使用它们的客户可以随意改变move的方式或者attack的方式。

优点:解耦,开闭原则
缺点:
1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。
!!!这个可以用简单工厂结合,就不用客户端知道所有策略类!!!
2、 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。

<?php
/*
场景:一个职务大战僵尸的,有各种不同行走和不同攻击方式的僵尸
*/

interface moveable{
    public function move();
}

interface attackable{
    public function attack();
}

abstract class jiangshi{
    public $moveable;
    public $attackable;
    
    public function setMoveable($moveable){
        $this->moveable = $moveable;
    }
    
    public function getMoveable(){
        return $this->moveable;
    }
    
    public function setAttackable($attackable){
        $this->attackable = $attackable;
    }
    
    public function getAttackable(){
        return $this->attackable;
    }
    
    public abstract function display();

}

class stepByStep implements moveable{
    public function move()
    {
        echo "一步一步走 \n";
    }
}

class runQuickly implements moveable{
    public function move()
    {
        echo "快速跑\n";
    }
}

class biteAttack implements attackable{
    public function attack()
    {
        echo "咬\n";
    }
}

class normalJiangshi extends jiangshi{
    public function __construct($moveable, $attack)
    {
        $this->moveable = $moveable;
        $this->attackable = $attack;
    }

    public function display(){
        echo "我是普通僵尸 \n";
    }
    
    public function move(){
        $this->moveable->move();
    }

    public function attack(){
        $this->attackable->attack();
    }
}

$normal = new normalJiangshi(new stepByStep(), new biteAttack());
$normal->display();
$normal->move();
$normal->attack();

$normal->setMoveable(new runQuickly());
$normal->move();

输出:
我是普通僵尸
一步一步走

快速跑

上一篇 下一篇

猜你喜欢

热点阅读