欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP设计模式—桥接模式

程序员文章站 2022-06-10 13:49:29
定义: 桥接模式(Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。 结构: Abstraction:抽象类。 RefindAbstraction:被提炼的抽象类。 Implementor:实现类。 ConcreteImplementor:具体实现类 。 Client:客户端代码 ......

 

定义:

桥接模式(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();


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

 

总结:

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