<?php // 抽象化角色,抽象化给出的定义,并保存一个对实现化对象的引用--画图抽象类 abstract class Abstraction { protected $imp; // 对实现化对象的引用 public function operation() { $this->imp->operationImp(); } } // 修正抽象化角色, 扩展抽象化角色,改变和修正父类对抽象化的定义--具体画图类 class RefinedAbstraction extends Abstraction { public function __construct(Implementor $imp) { $this->imp = $imp; } //@@@@@@@@@@@采用这个模式,这里要实现的功能可以很灵活的修改了 //@@@@@@@@@@如果是公共的,可以直接在这里添加 //@@@@@@@@@@如果是参数对象中私有的,可以直接在那个对象中添加或者修改 public function operation() { $this->imp->operationImp();//operationImp()是$imp下的方法 } } // 实现化角色, 给出实现化角色的接口,但不给出具体的实现--形状抽象类 abstract class Implementor { abstract public function operationImp(); } // 具体化角色A--方框 class ConcreteImplementorA extends Implementor { public function operationImp()//画方框 { echo "我是ConcreteImplementorA下面的operationImp方法:画一个方框<br>"; } } // 具体化角色B--圆圈 class ConcreteImplementorB extends Implementor { public function operationImp()//画圆圈 { echo "我是ConcreteImplementorB下面的operationImp方法:画一个圆圈<br>"; } } //@@@@@@@@@@@@@@@@@@@@@@使用实例-扩充:画一个多边形 class ConcreteImplementorC extends Implementor { public function operationImp()//画多边形 { echo "我是ConcreteImplementorC下面的operationImp方法:画一个多边形<br>"; } } // client $abstraction = new RefinedAbstraction(new ConcreteImplementorA());//把方框对象的某些能力给画图实例 $abstraction->operation();//画图类画方框 $abstraction = new RefinedAbstraction(new ConcreteImplementorB());//把圆圈对象的某些能力给画图实例 $abstraction->operation();//画图类画圆圈 $abstraction = new RefinedAbstraction(new ConcreteImplementorC()); $abstraction->operation(); ?>
// @ 部分 代表重点解释
原文:http://www.cnblogs.com/jiufen/p/5000904.html