加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

装饰器模式

发布时间:2020-12-14 04:46:26 所属栏目:百科 来源:网络整理
导读:原文链接:http://www.orlion.ga/735/ 解释: ????如果已有对象的部分内容或功能性发生了改变,但是不需要修改原始对象的结构,那么使用装饰器设计模式最合适 需求: ? ? 我们本来有一个UserList类: namespace?Decorator;class?UserList{public?$users?=?[];p

原文链接: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?DecoratorUserList();
$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?DecoratorUserList();
$ul->addUser('a');
$ul->addUser('b');
$ul->addUser('c');

$ul->outUsers();

$ulDecorator?=?new?DecoratorUserListDecorator($ul);
$ulDecorator->makeCaps();

$ul->outUsers();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读