学过J2SE的人一定还记得swing包中用装饰模式设计的JTextArea 、JScrollPane这些类,刚接触PHP没多久,今天试着写PHP的装饰模式(Decorator) 。装饰模式用来给已有的对象添加额外的功能。。。
<?php
abstract class Component {
abstract function writeln();
}
/**
* 装饰类
*/
class Decorator extends Component {
private $com;
public function __construct(Component $component) {
$this->com = $component;
}
public function writeln() {
$this->com->writeln();
}
}
/**
* Component类的实现子类
*/
class ConcreteComponent extends Component {
public function writeln() {
echo "这是ConcreteComponent类的 writeln() <br />";
}
}
/**
* 到这里Component类的writeln()方法是它的子类实现的
* 输出 "这是ConcreteComponent类的 writeln() <br />" 这句话
* 现在我们为Component 的writeln()添加额外的功能
*/
class DecoratorComponent1 extends Decorator {
public function __construct(Component $component) {
parent::__construct($component);
}
public function writeln() {
parent::writeln();
echo "这是DecoratorComponent1类添加的额外输出!<br />";
}
}
/**
* 继续添回额外的功能看看。
*/
class DecoratorComponent2 extends Decorator {
public function __construct(Component $component) {
parent::__construct($component);
}
public function writeln() {
parent::writeln();
echo "这是DecoratorComponent2类添加的额外输出!<br />";
}
}
/**
* 我们来看看装饰模式的工作情况
* 先用原始的ConcreteComponent子类构造Component的对象
*/
$component1 = new ConcreteComponent();
// 如果现在调用 $component->writeln(); 就会输出 "这是ConcreteComponent类的 writeln()"
// 我们用DecoratorComponent1包装Component对象$component1
$component2 = new DecoratorComponent1($component1);
// 这个时候我们给原始的writeln()多添加了一行输出
// 调用 $component2->writeln() 将输出
// 这是ConcreteComponent类的 writeln()
// 这是DecoratorComponent1类添加的额外输出!
// 再继续用DecoratorComponent2包装$component2
$component3 = new DecoratorComponent2($component2);
// 接下来调用
$component3->writeln();
// 结果输出:
//-----------------------------------------------------------------------------------------
// 这是ConcreteComponent类的 writeln()
// 这是DecoratorComponent1类添加的额外输出!
// 这是DecoratorComponent2类添加的额外输出!
?>$component1、$component2、$component3这三个对象都是Component的
如果这是用Java写的,就相当于:
Component component1 = new ConcreteComponent();
Component component2 = new DecoratorComponent1(component1);
Component component3 = new DecoratorComponent2(component2);
component3.writeln();
其实装饰模式大多时候用在设计GUI方面,因为可以给已有的GUI对象添加一些小东西,比如设计模版的时候。。。这就要多动动脑筯了。。。如何给设计好的模版动态的添加修饰。。。。
PS:转载请注明作者与出处

本文通过具体实例介绍了PHP中装饰模式的应用。装饰模式允许在不改变原有对象的情况下为其添加新的功能,文中通过创建不同装饰类来逐步增加功能。
534

被折叠的 条评论
为什么被折叠?



