装饰器模式
发布时间: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(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |