设计模式之桥接模式(php实现)

/**
 * 桥接模式
 * 优点:
 * 1、分离抽象接口及其实现部分。提高了比继承更好的解决方案。
 * 2、桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
 * 3、实现细节对客户透明,可以对用户隐藏实现细节。
 * 缺点:
 * 1、桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
 * 2、桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。
 *
 * 例子: 形状和颜色  各种颜色的形状进行组合,如果进行多层继承,添加一个颜色或者形状会增加很多类
 */

(1) Color.class.php(颜色接口,用户规范子类实现)

<?php

namespace Bridge;

interface Color
{
    public function paint($shape);
}

(2)Gray.class.php(灰色子类)

<?php

namespace Bridge;

class Gray implements Color
{
    public function paint($shape)
    {
        var_dump("灰色的".$shape);
        echo '<br/>';
    }
}

(3)Black.class.php(黑色子类)

<?php

namespace Bridge;

class Black implements Color
{
    public function paint($shape)
    {
        var_dump("黑色的".$shape);
        echo '<br/>';
    }
}

(4)Shape.class.php 形状抽象父类(公共设置方法和规范子类实现)

<?php

namespace Bridge;

abstract class Shape
{
    protected $color;

    public function setColor(Color $color)
    {
        $this->color = $color;
    }

    public abstract function draw();
}

(5)Circle.class.php(圆形子类)

<?php

namespace Bridge;

class Circle extends Shape
{
    public function draw()
    {
        $this->color->paint('圆形');
    }
}

(6)Rectangle.class.php(长方形子类)

<?php

namespace Bridge;

class Rectangle extends Shape
{
    public function draw()
    {
        $this->color->paint('长方形');
    }
}

(7)Square.class.php

<?php

namespace Bridge;

class Square extends Shape
{
    public function draw()
    {
        $this->color->paint('正方形');
    }
}

(8)brige.php

<?php

spl_autoload_register(function ($className){
    $className = str_replace('\\','/',$className);
    include $className.".class.php";
});

use Bridge\White;
use Bridge\Square;
use Bridge\Rectangle;


$white = new White();
$square = new Square();
$square->setColor($white);
$square->draw();


$rectangle = new Rectangle();
$rectangle->setColor($white);
$rectangle->draw();

猜你喜欢

转载自www.cnblogs.com/zhouqi666/p/9135409.html