PHP设计模式—桥接模式

 

定义:

桥接模式(Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。

 

结构:

  • Abstraction:抽象类。
  • RefindAbstraction:被提炼的抽象类。
  • Implementor:实现类。
  • ConcreteImplementor:具体实现类 。
  • Client:客户端代码。

 

代码实例:

接下来用代码实现一个颜色组合的例子,有三种颜色:黑、白、红,三种形状:圆形、正方形、长方形,可以自由组合。在这个例子中Abstraction表示形状,RefindAbstraction表示圆形、正方形、长方形,Implementor表示颜色,ConcreteImplementor表示黑、白、红。

/**
 * 颜色抽象类
 * Class Colour
 */
abstract class Colour
{
    /**
     * @return mixed
     */
    abstract public function run();
}


/**
 * 黑色
 * Class Black
 */
class Black extends Colour
{
    public function run()
    {
        // TODO: Implement run() method.
        return '黑色';
    }
}


/**
 * 白色
 * Class White
 */
class White extends Colour
{
    public function run()
    {
        // TODO: Implement run() method.
        return '白色';
    }
}


/**
 * 红色
 * Class Red
 */
class Red extends Colour
{
    public function run()
    {
        // TODO: Implement run() method.
        return '红色';
    }
}


/**
 * 形状抽象类
 * Class Shape
 */
abstract class Shape
{
    /**
     * 颜色
     * @var Colour
     */
    protected $colour;


    /**
     * Shape constructor.
     * @param Colour $colour
     */
    public function __construct(Colour $colour)
    {
        $this->colour = $colour;
    }


    /**
     * @return mixed
     */
    abstract public function operation();
}


/**
 * 圆形
 * Class Round
 */
class Round extends Shape
{
    /**
     * @return mixed|void
     */
    public function operation()
    {
        // TODO: Implement operation() method.
        echo $this->colour->run() . '圆形<br>';
    }
}


/**
 * 长方形
 * Class Rectangle
 */
class Rectangle extends Shape
{
    /**
     * @return mixed|void
     */
    public function operation()
    {
        // TODO: Implement operation() method.
        echo $this->colour->run() . '长方形<br>';
    }
}


/**
 * 正方形
 * Class Square
 */
class Square extends Shape
{
    /**
     * @return mixed|void
     */
    public function operation()
    {
        // TODO: Implement operation() method.
        echo $this->colour->run() . '正方形<br>';
    }
}


// 客户端代码
// 白色圆形
$whiteRound = new Round(new White());
$whiteRound->operation();

// 黑色正方形
$blackSquare = new Square(new Black());
$blackSquare->operation();

// 红色长方形
$redRectangle = new Rectangle(new Red());
$redRectangle->operation();


// 运行结果
白色圆形
黑色正方形
红色长方形

 

总结:

  • 桥接模式分离抽象接口及其实现部分,实现解耦,相比继承而言,无疑是一个更好的解决方案。
  • 方便扩展,桥接模式相比继承而言更加灵活,减少创建类的同时还方便组合。
  • 对于两个独立变化的维度,可以使用桥接模式。

 

posted @ 2021-06-29 20:58  幽篁晓筑  阅读(124)  评论(0编辑  收藏  举报