首页 后端开发 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(); 
?>
登录后复制


单件模式

代码如下:

<?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); 
?>
登录后复制


工厂方法模式

复制代码 代码如下:

<?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"; 
?>
登录后复制


工厂模式

代码如下:

<?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;); 
?>
登录后复制


观察者模式

代码如下:

<?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); 
?>
登录后复制


命令模式

复制代码 代码如下:

<?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(); 
?>
登录后复制


装饰者模式

复制代码 代码如下:

<?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"; 
?>
登录后复制


状态模式

复制代码 代码如下:

<?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) 
?>
登录后复制

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


本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

CakePHP 项目配置 CakePHP 项目配置 Sep 10, 2024 pm 05:25 PM

在本章中,我们将了解CakePHP中的环境变量、常规配置、数据库配置和电子邮件配置。

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

CakePHP 日期和时间 CakePHP 日期和时间 Sep 10, 2024 pm 05:27 PM

为了在 cakephp4 中处理日期和时间,我们将使用可用的 FrozenTime 类。

CakePHP 文件上传 CakePHP 文件上传 Sep 10, 2024 pm 05:27 PM

为了进行文件上传,我们将使用表单助手。这是文件上传的示例。

CakePHP 路由 CakePHP 路由 Sep 10, 2024 pm 05:25 PM

在本章中,我们将学习以下与路由相关的主题?

讨论 CakePHP 讨论 CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP 是 PHP 的开源框架。它的目的是使应用程序的开发、部署和维护变得更加容易。 CakePHP 基于类似 MVC 的架构,功能强大且易于掌握。模型、视图和控制器 gu

如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写

CakePHP 创建验证器 CakePHP 创建验证器 Sep 10, 2024 pm 05:26 PM

可以通过在控制器中添加以下两行来创建验证器。

See all articles