Maison développement back-end tutoriel php 《Head First 设计模式》代码之PHP版(面向对象学习)_php技巧

《Head First 设计模式》代码之PHP版(面向对象学习)_php技巧

May 17, 2016 am 09:24 AM
php 设计模式 面向对象

《Head First 设计模式》是本不错的讲解设计模式的书,不像F4写的那么枯燥,应该算是比较容易理解的好书。

书中的例子都比较浅显易懂,不过由于是外国佬写的,所以例子的习惯不是很附合中国特色,可能偶尔看起来有些别扭,还有语言习惯也不是中国风。当然��看过这本书之后,你才能深刻理解设计模式到底能为你解决哪些问题,不能为你解决哪些问题(比如不能代替你的编码)。
  我将书中部分代码改成PHP,看下代码再配合概念应该是比较容易理解了。

策略模式

 代码如下:

<?php 
/** 
* 策略模式 
* 定义了算法族,分别封装起来,让它们之间可以互相替换, 
* 此模式让算法的变化独立于使用算法的客户。 
*/ 
//飞行行为接口 
interface FlyBehavior { 
public function fly(); 
} 
//呱呱叫行为接口 
interface QuackBehavior { 
public function quack(); 
} 
//翅膀飞行 
class FlyWithWings implements FlyBehavior { 
public function fly() { 
echo "I&#39;m flying!!\n"; 
} 
} 
//不会飞 
class FlyNoWay implements FlyBehavior { 
public function fly() { 
echo "I can&#39;t fly!\n"; 
} 
} 
class FlyRocketPowered implements FlyBehavior { 
public function fly() { 
echo "I&#39;m flying with a rocket!\n"; 
} 
} 
class Qquack implements QuackBehavior { 
public function quack() { 
echo "Quack\n"; 
} 
} 
class Squeak implements QuackBehavior { 
public function quack() { 
echo "Squeak\n"; 
} 
} 
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&#39;m a model duck!\n"; 
} 
} 
$model = new ModelDuck(); 
$model->performFly(); 
$model->performQuack(); 
//提供新的能力 
$model->setFlyBehavior(new FlyRocketPowered()); 
$model->setQuackBehavior(new Squeak()); 
$model->performFly(); 
$model->performQuack(); 
?>
Copier après la connexion


单件模式

代码如下:

<?php 
/** 
* 单件模式 
* 确保一个类只有一个实例,并提供一个全局访问点。 
*/ 
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); 
?>
Copier après la connexion


工厂方法模式

复制代码 代码如下:

<?php 
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 350\n"; 
} 
public function cut() { 
echo "Cutting the pizza into diagonal slices\n"; 
} 
public function box() { 
echo "Place pizza in official PizzaStore box\n"; 
} 
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 slices\n"; 
} 
} 
$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"; 
?>
Copier après la connexion


工厂模式

代码如下:

<?php 
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(&#39;New York Style Cheese Pizza&#39;); 
} elseif ($type == "veggie") { 
$pizza = new VeggiePizza($ingredientFactory); 
$pizza->setName(&#39;New York Style Veggie Pizza&#39;); 
} elseif ($type == "clam") { 
$pizza = new ClamPizza($ingredientFactory); 
$pizza->setName(&#39;New York Style Clam Pizza&#39;); 
} elseif ($type == "papperoni") { 
$pizza = new PapperoniPizza($ingredientFactory); 
$pizza->setName(&#39;New York Style Papperoni Pizza&#39;); 
} 
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\n"; 
} 
public function cut() { 
echo "Cutting the pizza into diagonal slices\n"; 
} 
public function box() { 
echo "Place pizza in official PizzaStore box\n"; 
} 
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(&#39;cheese&#39;); 
?>
Copier après la connexion


观察者模式

代码如下:

<?php 
/** 
* 观察者模式 
* 定义了对象之间的一对多依赖,当一个对象改变状态时, 
* 它的所有依赖者都会收到通知并自动更新。 
*/ 
interface Subject { 
public function registerObserver(Observer $o); 
public function removeObserver(Observer $o); 
public function notifyObservers(); 
} 
interface Observer { 
public function update($temperature, $humidity, $pressure); 
} 
interface DisplayElement { 
public function display(); 
} 
class WeatherData implements Subject { 
private $observers = array(); 
private $temperature; 
private $humidity; 
private $pressure; 
public function __construct() { 
$this->observers = array(); 
} 
public function registerObserver(Observer $o) { 
$this->observers[] = $o; 
} 
public function removeObserver(Observer $o) { 
if (($key = array_search($o, $this->observers)) !== false) { 
unset($this->observers[$key]); 
} 
} 
public function notifyObservers() { 
foreach ($this->observers as $observer) { 
$observer->update($this->temperature, $this->humidity, $this->pressure); 
} 
} 
public function measurementsChanged() { 
$this->notifyObservers(); 
} 
public function setMeasurements($temperature, $humidity, $pressure) { 
$this->temperature = $temperature; 
$this->humidity = $humidity; 
$this->pressure = $pressure; 
$this->measurementsChanged(); 
} 
} 
class CurrentConditionsDisplay implements Observer, DisplayElement { 
private $temperature; 
private $humidity; 
private $weatherData; 
public function __construct(Subject $weatherData) { 
$this->weatherData = $weatherData; 
$weatherData->registerObserver($this); 
} 
public function update($temperature, $humidity, $pressure) { 
$this->temperature = $temperature; 
$this->humidity = $humidity; 
$this->display(); 
} 
public function display() { 
echo "温度:" . $this->temperature . "; 湿度:" . $this->humidity . "%\n"; 
} 
} 
class StatistionsDisplay implements Observer, DisplayElement { 
private $temperature; 
private $humidity; 
private $pressure; 
private $weatherData; 
public function __construct(Subject $weatherData) { 
$this->weatherData = $weatherData; 
$weatherData->registerObserver($this); 
} 
public function update($temperature, $humidity, $pressure) { 
$this->temperature = $temperature; 
$this->humidity = $humidity; 
$this->pressure = $pressure; 
$this->display(); 
} 
public function display() { 
echo "温度:" . $this->temperature . "; 湿度:" . $this->humidity . "%; 气压:" . $this->pressure . "\n"; 
} 
} 
$weatherData = new WeatherData(); 
$currentDisplay = new CurrentConditionsDisplay($weatherData); 
$statistionDisplay = new StatistionsDisplay($weatherData); 
$weatherData->setMeasurements(10, 20, 30); 
$weatherData->removeObserver($currentDisplay); 
$weatherData->setMeasurements(30, 40, 50); 
?>
Copier après la connexion


命令模式

复制代码 代码如下:

<?php 
class Light { 
public function __construct() { 
} 
public function on() { 
echo "Light On\n"; 
} 
public function off() { 
echo "Light Off\n"; 
} 
} 
interface Command { 
public function execute(); 
} 
class LightOnCommand implements Command { 
public $light; 
public function __construct(Light $light) { 
$this->light = $light; 
} 
public function execute() { 
$this->light->on(); 
} 
} 
class SimpleRemoteControl { 
public $slot; 
public function __construct() { 
} 
public function setCommand(Command $command) { 
$this->slot = $command; 
} 
public function buttonWasPressed() { 
$this->slot->execute(); 
} 
} 
class RemoteControlTest { 
public static function main() { 
$remote = new SimpleRemoteControl(); 
$light = new Light(); 
$lightOn = new LightOnCommand($light); 
$remote->setCommand($lightOn); 
$remote->buttonWasPressed(); 
} 
} 
RemoteControlTest::main(); 
?>
Copier après la connexion


装饰者模式

复制代码 代码如下:

<?php 
/** 
* 装饰着模式 
* 动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。 
*/ 
abstract class Beverage { 
public $description = "Unknown Beverage"; 
public function getDescription() { 
return $this->description; 
} 
public abstract function cost(); 
} 
abstract class CondimentDecorator extends Beverage { 
//JAVA代码里这里是个抽象类,PHP不允许这么做 
public function getDescription() { 
return $this->description; 
} 
} 
class Espresso extends Beverage { 
public function __construct() { 
$this->description = "Espresso"; 
} 
public function cost() { 
return 1.99; 
} 
} 
class HouseBlend extends Beverage { 
public function __construct() { 
$this->description = "HouseBlend"; 
} 
public function cost() { 
return .89; 
} 
} 
class DarkRoast extends Beverage { 
public function __construct() { 
$this->description = "DarkRoast"; 
} 
public function cost() { 
return .99; 
} 
} 
class Mocha extends CondimentDecorator { 
public $beverage; 
public function __construct(Beverage $beverage) { 
$this->beverage = $beverage; 
} 
public function getDescription() { 
return $this->beverage->getDescription() . ", Mocha"; 
} 
public function cost() { 
return .20 + $this->beverage->cost(); 
} 
} 
class Whip extends CondimentDecorator { 
public $beverage; 
public function __construct(Beverage $beverage) { 
$this->beverage = $beverage; 
} 
public function getDescription() { 
return $this->beverage->getDescription() . ", Whip"; 
} 
public function cost() { 
return .10 + $this->beverage->cost(); 
} 
} 
class Soy extends CondimentDecorator { 
public $beverage; 
public function __construct(Beverage $beverage) { 
$this->beverage = $beverage; 
} 
public function getDescription() { 
return $this->beverage->getDescription() . ", Soy"; 
} 
public function cost() { 
return .15 + $this->beverage->cost(); 
} 
} 
$beverage = new Espresso(); 
echo $beverage->getDescription() . "\n"; 
$beverage2 = new DarkRoast(); 
$beverage2 = new Mocha($beverage2); 
$beverage2 = new Mocha($beverage2); 
$beverage2 = new Whip($beverage2); 
echo $beverage2->getDescription() . " $" . $beverage2->cost() . "\n"; 
$beverage3 = new HouseBlend(); 
$beverage3 = new Soy($beverage3); 
$beverage3 = new Mocha($beverage3); 
$beverage3 = new Whip($beverage3); 
echo $beverage3->getDescription() . " $" . $beverage3->cost() . "\n"; 
?>
Copier après la connexion


状态模式

复制代码 代码如下:

<?php 
class GumballMachine { 
const SOLD_OUT = 0; 
const NO_QUARTER = 1; 
const HAS_QUARTER = 2; 
const SOLD = 3; 
public $state = self::SOLD_OUT; 
public $count = 0; 
public function __construct($count) { 
$this->count = $count; 
if ($count > 0) { 
$this->state = self::NO_QUARTER; 
} 
} 
public function insertQuarter() { 
if ($this->state == self::HAS_QUARTER) { 
echo "You can&#39;t insert another quarter!\n"; 
} else if ($this->state == self::NO_QUARTER) { 
$this->state = self::HAS_QUARTER; 
echo "You inserted a quarter!\n"; 
} else if ($this->state == self::SOLD_OUT) { 
echo "You can&#39;t insert a quarter, the machine is sold out!\n"; 
} else if ($this->state == self::SOLD) { 
echo "Please wait, we&#39;re already giving you a gumball!\n"; 
} 
} 
} 
$obj = new GumballMachine(0); 
print_r($obj) 
?>
Copier après la connexion

 以上就是《Head First 设计模式》代码之PHP版(面向对象学习)_php技巧的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Configuration du projet CakePHP Configuration du projet CakePHP Sep 10, 2024 pm 05:25 PM

Dans ce chapitre, nous comprendrons les variables d'environnement, la configuration générale, la configuration de la base de données et la configuration de la messagerie dans CakePHP.

Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

Date et heure de CakePHP Date et heure de CakePHP Sep 10, 2024 pm 05:27 PM

Pour travailler avec la date et l'heure dans cakephp4, nous allons utiliser la classe FrozenTime disponible.

Téléchargement de fichiers CakePHP Téléchargement de fichiers CakePHP Sep 10, 2024 pm 05:27 PM

Pour travailler sur le téléchargement de fichiers, nous allons utiliser l'assistant de formulaire. Voici un exemple de téléchargement de fichiers.

Routage CakePHP Routage CakePHP Sep 10, 2024 pm 05:25 PM

Dans ce chapitre, nous allons apprendre les sujets suivants liés au routage ?

Discuter de CakePHP Discuter de CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP est un framework open source pour PHP. Il vise à faciliter grandement le développement, le déploiement et la maintenance d'applications. CakePHP est basé sur une architecture de type MVC à la fois puissante et facile à appréhender. Modèles, vues et contrôleurs gu

CakePHP travaillant avec la base de données CakePHP travaillant avec la base de données Sep 10, 2024 pm 05:25 PM

Travailler avec la base de données dans CakePHP est très simple. Nous comprendrons les opérations CRUD (Créer, Lire, Mettre à jour, Supprimer) dans ce chapitre.

CakePHP créant des validateurs CakePHP créant des validateurs Sep 10, 2024 pm 05:26 PM

Le validateur peut être créé en ajoutant les deux lignes suivantes dans le contrôleur.

See all articles