设计模式学习笔记-装饰器模式

比如人的行为类,刚刚开始的时候,就能上得了厅堂,下得了厨房。但随着年岁的增长,每个人历经了世事,变得不仅是上得了厅堂,下得了厨房。有些人能斗得过流氓,有些人修得了电脑。

那么如果用代码表示这些增加了特殊行为的人。


interface IPerson{
	public function action();
}

class Person implements IPerson { //刚刚开始人的行为
	public function action() {
		echo "<br>上得了厅堂,下得了厨房<br>";
	}
}

如果有人增加了它的行为,我们有几种方式去解决。一是通过继承IPerson 重新实现一个新的具体类。二是对原有的Persion实例添加新行为。第一种方式属于继承(即要实现新行为,也要将原有的行为实现),第二种方式是组合(添加新行为)。

第一种方式我相信大家都能简单实现,我们来看看第二种方式的代码实现:

//虽然岁月的流逝,人越来越成熟稳重,能力也越来越强,原来的Person 再无法描述他的行为

 class PersonDecorate implements IPerson {
	private $_person = null;
	public function __construct($person) {
		$this->_person = $person;
	}
	public function action(){
		$this->_person->action();
		$this->newAction();
	}
	public function newAction() {//新行为
		echo "<br>斗得过流氓,修得了电脑<br>";
	}
}
//开始时,懵懂的人
$Person = new Person();
$Person->action();
echo "<br>------------------------<br>";
//成熟的人
$Person2 = new PersonDecorate($Person);
$Person2->action(); // 添加了行为

上面的实现就是今天的主角--装饰器模式

装饰器模式:包装一个对象,提供新的行为(意在为一个已有的类提供一个新行为)。

1.比静态继承更灵活 与对象的静态继承(多重继承)相比,Decorator 模式提供了更加灵活的向对象添加职责的方式。可以用添加和分离的方法,用装饰在运行时刻增加和删除职责。

2.相比之下,继承机制要求为每个添加的职责创建一个新的子类,这会产生许多新的类,并且会增加系统的复杂度。

猜你喜欢

转载自blog.csdn.net/H_L_S/article/details/86663333
今日推荐