PHP试写装饰模式(Java、C#亦同)

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      学过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:转载请注明作者与出处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值