桥接模式的一个画图形实例

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

?>
// @ 部分  代表重点解释
原文地址:https://www.cnblogs.com/jiufen/p/5000904.html