0

0

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

PHP中文网

PHP中文网

发布时间:2016-05-17 09:24:47

|

1331人浏览过

|

来源于php中文网

原创

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

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

策略模式

 代码如下:

>\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(); 
//提供新的能力 
$model->setFlyBehavior(new FlyRocketPowered()); 
$model->setQuackBehavior(new Squeak()); 
$model->performFly(); 
$model->performQuack(); 
?>


单件模式

代码如下:


工厂方法模式

复制代码 代码如下:

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免费学习笔记(深入)”;

 代码如下:

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 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('cheese'); 
?>


观察者模式

QIMI奇觅
QIMI奇觅

美图推出的游戏行业广告AI制作与投放一体化平台

下载

代码如下:

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); 
?>


命令模式

复制代码 代码如下:

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(); 
?>


装饰者模式

复制代码 代码如下:

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"; 
?>


状态模式

复制代码 代码如下:

count = $count; 
if ($count > 0) { 
$this->state = self::NO_QUARTER; 
} 
} 
public function insertQuarter() { 
if ($this->state == self::HAS_QUARTER) { 
echo "You can'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't insert a quarter, the machine is sold out!\n"; 
} else if ($this->state == self::SOLD) { 
echo "Please wait, we're already giving you a gumball!\n"; 
} 
} 
} 
$obj = new GumballMachine(0); 
print_r($obj) 
?>

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


相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
clawdbot ai使用教程 保姆级clawdbot部署安装手册
clawdbot ai使用教程 保姆级clawdbot部署安装手册

Clawdbot是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

13

2026.01.29

clawdbot龙虾机器人官网入口 clawdbot ai官方网站地址
clawdbot龙虾机器人官网入口 clawdbot ai官方网站地址

clawdbot龙虾机器人官网入口:https://clawd.bot/,clawdbot ai是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

5

2026.01.29

Golang 网络安全与加密实战
Golang 网络安全与加密实战

本专题系统讲解 Golang 在网络安全与加密技术中的应用,包括对称加密与非对称加密(AES、RSA)、哈希与数字签名、JWT身份认证、SSL/TLS 安全通信、常见网络攻击防范(如SQL注入、XSS、CSRF)及其防护措施。通过实战案例,帮助学习者掌握 如何使用 Go 语言保障网络通信的安全性,保护用户数据与隐私。

7

2026.01.29

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

540

2026.01.28

包子漫画在线官方入口大全
包子漫画在线官方入口大全

本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。

189

2026.01.28

ao3中文版官网地址大全
ao3中文版官网地址大全

AO3最新中文版官网入口合集,汇总2026年主站及国内优化镜像链接,支持简体中文界面、无广告阅读与多设备同步。阅读专题下面的文章了解更多详细内容。

323

2026.01.28

php怎么写接口教程
php怎么写接口教程

本合集涵盖PHP接口开发基础、RESTful API设计、数据交互与安全处理等实用教程,助你快速掌握PHP接口编写技巧。阅读专题下面的文章了解更多详细内容。

10

2026.01.28

php中文乱码如何解决
php中文乱码如何解决

本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。

16

2026.01.28

Java 消息队列与异步架构实战
Java 消息队列与异步架构实战

本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

10

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 10.1万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号