设计模式之策略模式


  • 面向对象中有什么比是什么更灵活
  • 组合比继承更灵活
  • 饭店和厨师的关系 是 一对多
  • 比如新开饭店 如果单纯的复制饭店 这样不能会造成很多浪费的方法 但是如果以饭店拥有厨师的方式处理 那么 饭店的样式可以随机变换,因此首先声明一个饭店类
class FD
{
    protected $tangCreator = null;
    protected $caiCreator = null;
    protected $fanCreator = null;

    public function __construct($f,$c,$t) {
        $this->fanCreator = $f;
        $this->tangCreator = $t;
        $this->caiCreator = $c;
    }

    public function createFan() {
        return $this->fanCreator->fan();
    }

    public function createCai() {
        return $this->caiCreator->cai();
    }

    public function createTang() {
        return $this->tangCreator->tang();
    }
}

再声明厨师类

class SouthDinner {
    public function fan() {
        return '米饭';
    }

    public function cai() {
        return '甜食';
    }

    public function tang() {
        return '蛋花汤';
    }
}

class NorthDinner {
    public function fan() {
        return '馒头';
    }

    public function cai() {
        return '炒菜';
    }

    public function tang() {
        return '粥';
    }
}

最后调用

$fd = new FD(new SouthDinner(),new NorthDinner(),new SouthDinner());

echo $fd->createCai(),'<br>';
echo $fd->createTang(),'<br>';