标签:
原文链接:http://www.orlion.ga/735/
解释:
如果已有对象的部分内容或功能性发生了改变,但是不需要修改原始对象的结构,那么使用装饰器设计模式最合适
需求:
我们本来有一个UserList类:
namespace Decorator;
class UserList{
public $users = [];
public function addUser($user) {
$this->users[] = $user;
}
public function outUsers(){
foreach ($this->users as $user) {
echo $user . ‘<br/>‘;
}
}
}
App.php:
require ‘UserList.php‘; $ul = new Decorator\UserList(); $ul->addUser(‘a‘); $ul->addUser(‘b‘); $ul->addUser(‘c‘); $ul->outUsers();
其中outUsers是把UserList保存的所有的用户打印出来,后来我们的需求变了,在输出用户的时候还要将用户变成大写的,直观的写法是修改outUsers()方法。但是对于这么小的改变最好的做法不是修改基类,而是创建一个基于装饰器模式的对象。
代码:
创建一个装饰器:
namespace Decorator;
class UserListDecorator{
private $_ul;
public function __construct(UserList $ul) {
$this->_ul = $ul;
}
public function makeCaps() {
foreach ($this->_ul->users as & $user) {
$user = strtoupper($user);
}
}
}
可以看到我们在装饰器类的makeCaps对userlist对象做了修改,将它保存的所有用户都变成了大写。
App.php:
require ‘UserList.php‘; require ‘UserListDecorator.php‘; $ul = new Decorator\UserList(); $ul->addUser(‘a‘); $ul->addUser(‘b‘); $ul->addUser(‘c‘); $ul->outUsers(); $ulDecorator = new Decorator\UserListDecorator($ul); $ulDecorator->makeCaps(); $ul->outUsers();
标签:
原文地址:http://www.cnblogs.com/orlion/p/5350913.html