策略模式 复制代码 代码如下: <?php /** * 策略模式 * 定义了算法族,分别封装起来,让它们之间可以互相替换, * 此模式让算法的变化独立于使用算法的客户。 */ //飞行行为接口 interface FlyBehavior { public function fly(); } //呱呱叫行为接口 interface QuackBehavior { public function quack(); } //翅膀飞行 class FlyWithWings implements FlyBehavior { public function fly() { echo "I"m flying!!
"; } } //不会飞 class FlyNoWay implements FlyBehavior { public function fly() { echo "I can"t fly!
"; } } class FlyRocketPowered implements FlyBehavior { public function fly() { echo "I"m flying with a rocket!
"; } } class Qquack implements QuackBehavior { public function quack() { echo "Quack
"; } } class Squeak implements QuackBehavior { public function quack() { echo "Squeak
"; } } class MuteQuack implements QuackBehavior { public function quack() { echo "<< Silence >>
"; } } abstract class Duck { protected $quack_obj; protected $fly_obj; public abstract function display();
public function performQuack() { $this->quack_obj->quack(); } public function performFly() { $this->fly_obj->fly(); } public function swim() { echo "All ducks float, even decoys!
"; } public function setFlyBehavior(FlyBehavior $fb) { $this->fly_obj = $fb; } public function setQuackBehavior(QuackBehavior $qb) { $this->quack_obj = $qb; } }
class ModelDuck extends Duck { public function __construct() { $this->fly_obj = new FlyNoWay(); $this->quack_obj = new MuteQuack(); } public function display() { echo "I"m a model duck!
"; } }
public abstract function createPizza($type); } class NYPizzaStore extends PizzaStore { public function createPizza($type) { $pizza = null; $ingredientFactory = new NYPizzaIngredientFactory(); if ($type == "cheese") { $pizza = new CheesePizza($ingredientFactory); $pizza->setName("New York Style Cheese Pizza"); } elseif ($type == "veggie") { $pizza = new VeggiePizza($ingredientFactory); $pizza->setName("New York Style Veggie Pizza"); } elseif ($type == "clam") { $pizza = new ClamPizza($ingredientFactory); $pizza->setName("New York Style Clam Pizza"); } elseif ($type == "papperoni") { $pizza = new PapperoniPizza($ingredientFactory); $pizza->setName("New York Style Papperoni Pizza"); } return $pizza; } } class ChicagoPizzaStore extends PizzaStore { public function createPizza($type) { if ($type == "cheese") { return new ChicagoStyleCheesePizza(); } elseif ($type == "veggie") { return new ChicagoStyleVeggiePizza(); } elseif ($type == "clam") { return new ChicagoStyleClamPizza(); } elseif ($type == "papperoni") { return new ChicagoStylePapperoniPizza(); } else { return null; } } } interface PizzaIngredientFactory { public function createDough(); public function createSauce(); public function createCheese(); public function createVeggies(); public function createPepperoni(); public function createClam(); } class NYPizzaIngredientFactory implements PizzaIngredientFactory { public function createDough() { return new ThinCrustDough(); } public function createSauce() { return new MarinaraSauce(); } public function createCheese() { return new ReggianoCheese(); } public function createVeggies() { $veggies = array( new Garlic(), new Onion(), new Mushroom(), new RedPepper(), ); return $veggies; } public function createPepperoni() { return new SlicedPepperoni(); } public function createClam() { return new FreshClams(); } } class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory { public function createDough() { return new ThickCrustDough(); } public function createSauce() { return new PlumTomatoSauce(); } public function createCheese() { return new Mozzarella(); } public function createVeggies() { $veggies = array( new BlackOlives(), new Spinach(), new EggPlant(), ); return $veggies; } public function createPepperoni() { return new SlicedPepperoni(); } public function createClam() { return new FrozenClams(); } } abstract class Pizza { public $name; public $dough; public $sauce; public $veggies = array(); public $cheese; public $pepperoni; public $clam;
public abstract function prepare();
public function bake() { echo "Bake for 25 minutes at 350
"; }
public function cut() { echo "Cutting the pizza into diagonal slices
"; }
public function box() { echo "Place pizza in official PizzaStore box
"; }
public function getName() { return $this->name; }
public function setName($name) { $this->name = $name; }
public function __toString() {
} }
class CheesePizza extends Pizza { public $ingredientFactory;
public function __construct(PizzaIngredientFactory $ingredientFactory) { $this->ingredientFactory = $ingredientFactory; }