大话设计模式-装饰者模式

abstract class Component {
	public abstract function operation();
}

class ConcreteComponent extends Component {
	public function operation() {
		echo '具体对象的操作<br/>';
	}
}

abstract class Decorator extends Component {
	protected $component;

	public function setComponent(Component $component) {
		//设置Component
		$this->component = $component;
	}

	public function operation() {
		//重写Operation(),实际执行的是Component的Operation()
		if($this->component != null) {
			$this->component->operation();
		}
	}
}


class ConcreteDecoratorA extends Decorator {
	//本类的独有功能,区别于ConcreteDecoratorB
	private $addedState;

	public function operation() {
		//首先运行原Component的Operation(),再执行本类的功能,如 addState,相当于对原Component进行了装饰
		parent::operation();
		$this->addedState = 'New State';
		echo '具体装饰对象A的操作<br/>';
	}
}

class ConcreteDecoratorB extends Decorator {
	public function operation() {
		//首先运行原Component的Operation(),再执行本类的功能,如 AddedBehavior(),相当于对原Component进行了装饰
		parent::operation();
		$this->addedBehavior();
		echo '具体装饰对象B的操作<br/>';
	}

	//本类的独有方法,区别于ConcreteDecorator
	private function addedBehavior() {
	}
}

//装饰的方法是:首先用ConcreteComponent实例化对象c,然后用ConcreteDecoratorA的实例化对象d1来包装c,在用ConcreteDecoratorB的对象d2包装d1,最终执行d2的Operation()
$c = new ConCreteComponent();
$d1 = new ConcreteDecoratorA();
$d2 = new ConcreteDecoratorB();

$d1->setComponent($c);
$d2->setComPonent($d1);
$d2->operation();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值