装饰器模式

前端之家收集整理的这篇文章主要介绍了装饰器模式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

原文链接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();

猜你在找的设计模式相关文章