代码如下:
UserInfo.php
//装饰器模式,对已有对象的部分内容或者功能进行调整,但是不需要修改原始对象结构,可以使用装饰器设计模式 class UserInfo { public $userInfo = array(); public function addUser($userInfo) { $this->userInfo[] = $userInfo; } public function getUserList() { print_r($this->userInfo); } }
//UserInfoDecorate 装饰一样,改变用户信息输出为大写格式,不改变原先UserInfo类 <?php include("UserInfo.php"); class UserInfoDecorate { public function makeCaps($UserInfo) { foreach ($UserInfo->userInfo as &$val) { $val = strtoupper($val); } } } $UserInfo = new UserInfo; $UserInfo->addUser('zhu'); $UserInfo->addUser('initphp'); $UserInfoDecorate = new UserInfoDecorate; $UserInfoDecorate->makeCaps($UserInfo); $UserInfo->getUserList();
到此,咱们应该是对于装饰器模式有了一个大概的了解,接下来咱们看一下构建装饰器模式的案例,网上的,先来看目录结构:
|decorator #项目根目录
|--Think #核心类库
|----Loder.php #自动加载类
|----decorator.php #装饰器接口
|----colorDecorator.php #颜色装饰器
|----sizeDecorator.php #字体大小装饰器
|----echoText.php #被装饰者
|--index.php #单一的入口文件
完事就是来构建装饰器接口,Think/decorator.php,如下:
<?php /** * 装饰器接口 * Interface decorator * @package Think */ namespace Think; interface decorator{ public function beforeDraw(); public function afterDraw(); }
再来就是颜色装饰器 Think/colorDecorator.php,如下:
<?php /** * 颜色装饰器 */ namespace Think; class colorDecorator implements decorator{ protected $color; public function __construct($color) { $this->color = $color; } public function beforeDraw() { echo "color decorator :{$this->color}\n"; } public function afterDraw() { echo "end color decorator\n"; } }
还有就是字体大小装饰器 Think/sizeDecorator.php,如下:
<?php /** * 字体大小装饰器 */ namespace Think; class sizeDecorator implements decorator{ protected $size; public function __construct($size) { $this->size = $size; } public function beforeDraw() { echo "size decorator {$this->size}\n"; } public function afterDraw() { echo "end size decorator\n"; } }
内容版权声明:除非注明,否则皆为本站原创文章。