The examples in the book are relatively easy to understand, but because they were written by a foreigner, the examples are not very in line with Chinese characteristics. They may occasionally look a little awkward, and the language habits are not Chinese. Of course, after reading this book, you can deeply understand what problems design patterns can solve for you and what problems they cannot solve for you (for example, they cannot replace your coding).
I changed some of the codes in the book to PHP. It should be easier to understand after looking at the code and combining it with the concepts.
Strategy Mode
Copy code The code is as follows:
/**
* Strategy pattern
* defines a family of algorithms and encapsulates them separately so that they can be replaced with each other.
* This mode makes the changes of the algorithm independent of the customers who use the algorithm.
*/
//Flying behavior interface
interface FlyBehavior {
public function fly();
}
//Quack behavior interface
interface QuackBehavior {
public function quack();
}
//Wing flying
class FlyWithWings implements FlyBehavior {
public function fly() {
echo "I'm flying!!n";
}
}
//Cannot fly
class FlyNoWay implements FlyBehavior {
public function fly() {
echo "I can't fly!n";
}
}
class FlyRocketPowered implements FlyBehavior {
public function fly() {
echo "I'm flying with a rocket!n";
}
}
class Qquack implements QuackBehavior {
public function quack() {
echo "Quackn";
}
}
class Squeak implements QuackBehavior {
public function quack() {
echo "Squeakn" ;
}
}
class MuteQuack implements QuackBehavior {
public function quack() {
echo "<< Silence >>n";
}
}
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!n";
}
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!n";
}
}
$model = new ModelDuck();
$model->performFly();
$model ->performQuack();
//Provide new capabilities
$model->setFlyBehavior(new FlyRocketPowered());
$model->setQuackBehavior(new Squeak());
$model->performFly();
$model->performQuack();
?>
Single-piece mode
Copy code The code is as follows:
/**
* Singleton Pattern
* Ensures there is only one instance of a class and provides a global access point.
*/
class MyClass {
private static $uniqueInstance;
private function __construct() {
}
public static function getInstance() {
if (self::$uniqueInstance == null) {
self: :$uniqueInstance = new MyClass();
}
return self::$uniqueInstance;
}
}
$myClass = MyClass::getInstance();
var_dump($ myClass);
$myClass = MyClass::getInstance();
var_dump($myClass);
?>
Factory Method Pattern
Copy code The code is as follows:
abstract class PizzaStore {
public function orderPizza($type) {
$pizza = $this->createPizza($type);
$pizza->prepare();
$pizza->bake();
$pizza->cut();
$pizza->box();
return $pizza;
}
public abstract function createPizza($type);
}
class NYPizzaStore extends PizzaStore {
public function createPizza($type) {
if ($type == "cheese") {
return new NYStyleCheesePizza();
} elseif ($type == "veggie") {
return new NYStyleVeggiePizza();
} elseif ($type == "clam") {
return new NYStyleClamPizza();
} elseif ($type == "papperoni") {
return new NYStylePapperoniPizza();
} else {
return null;
}
}
}
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;
}
}
}
abstract class Pizza {
public $name;
public $dough;
public $sauce;
public $toppings = array();
public function prepare() {
echo "Preparing " . $this->name . "n";
echo "Yossing dough...n";
echo "Adding sauce...n";
echo "Adding toppings: n";
for ($i = 0; $i < count($this->toppings); $i++) {
echo " " . $this->toppings[$i] . "n";
}
}
public function bake() {
echo "Bake for 25 minutes at 350n";
}
public function cut() {
echo "Cutting the pizza into diagonal slicesn";
}
public function box() {
echo "Place pizza in official PizzaStore boxn";
}
public function getName() {
return $this->name;
}
}
class NYStyleCheesePizza extends Pizza {
public function __construct() {
$this->name = "NY Style Sauce and cheese Pizza";
$this->dough = "Thin Crust Dough";
$this->sauce = "Marinara Sauce";
$this->toppings[] = "Grated Reggiano Cheese";
}
}
class NYStyleVeggiePizza extends Pizza {
public function __construct() {
$this->name = "NY Style Sauce and veggie Pizza";
$this->dough = "Thin Crust Dough";
$this->sauce = "Marinara Sauce";
$this->toppings[] = "Grated Reggiano veggie";
}
}
class NYStyleClamPizza extends Pizza {
public function __construct() {
$this->name = "NY Style Sauce and clam Pizza";
$this->dough = "Thin Crust Dough";
$this->sauce = "Marinara Sauce";
$this->toppings[] = "Grated Reggiano clam";
}
}
class NYStylePapperoniPizza extends Pizza {
public function __construct() {
$this->name = "NY Style Sauce and papperoni Pizza";
$this->dough = "Thin Crust Dough";
$this->sauce = "Marinara Sauce";
$this->toppings[] = "Grated Reggiano papperoni";
}
}
class ChicagoStyleCheesePizza extends Pizza {
public function __construct() {
$this->name = "Chicago Style Deep Dish Cheese Pizza";
$this->dough = "Extra Thick Crust Dough";
$this->sauce = "Plum Tomato Sauce";
$this->toppings[] = "Shredded Mozzarella Cheese";
}
public function cut() {
echo "Cutting the pizza into square slicesn";
}
}
$myStore = new NYPizzaStore();
$chicagoStore = new ChicagoPizzaStore();
$pizza = $myStore->orderPizza("cheese");
echo "Ethan ordered a " . $pizza->getName() . "n";
$pizza = $chicagoStore->orderPizza("cheese");
echo "Ethan ordered a " . $pizza->getName() . "n";
?>
工厂模式
复制代码 代码如下:
abstract class PizzaStore {
public function orderPizza($type) {
$pizza = $this->createPizza($type);
$pizza->prepare();
$pizza->bake();
$pizza->cut();
$pizza->box();
return $pizza;
}
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 350n";
}
public function cut() {
echo "Cutting the pizza into diagonal slicesn";
}
public function box() {
echo "Place pizza in official PizzaStore boxn";
}
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;
}
public function prepare() {
echo "Preparing " . $this->name . "n";
$this->dough = $this->ingredientFactory->createDough();
$this->sauce = $this->ingredientFactory->createSauce();
$this->cheese = $this->ingredientFactory->createCheese();
}
}
class ClamPizza extends Pizza {
public $ingredientFactory;
public function __construct(PizzaIngredientFactory $ingredientFactory) {
$this->ingredientFactory = $ingredientFactory;
}
public function prepare() {
echo "Preparing " . $this->name . "n";
$this->dough = $this->ingredientFactory->createDough();
$this->sauce = $this->ingredientFactory->createSauce();
$this->cheese = $this->ingredientFactory->createCheese();
$clam = $this->ingredientFactory->createClam();
}
}
$nyPizzaStore = new NYPizzaStore();
$nyPizzaStore->orderPizza('cheese');
?>
http://www.bkjia.com/PHPjc/322141.htmlwww.bkjia.comtruehttp: //www.bkjia.com/PHPjc/322141.htmlTechArticleThe examples in the book are relatively easy to understand, but because it is written by a foreigner, the examples are not very used. In line with Chinese characteristics, it may look a little awkward occasionally, and the language habits are also inconsistent...