<?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();
?>