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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值