[设计模式] 桥接模式

一、任务

有三种图形:正方形、三角形、椭圆形
有三种颜色:红色、蓝色、黄色
任意搭配:比如红色的正方形、蓝色的椭圆形、蓝色的三角形等等

二、分析

1.如果不是桥接模式,那么类有:
红色的正方形、黄色的正方形、蓝色的正方形...
红色的三角形、黄色的三角形、蓝色的三角形...
红色的椭圆形、黄色的椭圆形、蓝色的椭圆形...
总的类 > n × m (n是图形种类数,m是颜色种类数)
每增加一种图形,就需要增加 m 种颜色的图形类。每增加一种颜色,就需要增加 n 种颜色的图形类

2.如果是桥接模式,类有:
正方形类、三角形类、椭圆形类
红色类、黄色类、蓝色类
总的类 ≈ n + m (n是图形种类数,m是颜色种类数)
不管是增加图形或是颜色,就只需要增加一个类

3.优先使用 对象合成/聚合复用原则,而不是 类继承。

4.桥接模式则是为了让抽象和实现解耦;在减少创建类的同时还可以方便组合功能;

三、桥接模式UML图

【设计模式】桥接模式

四、代码

1、Graphics.php 抽象图形类
<?php
namespace app\bridge\controller;

abstract class Graphics
{
    /**
     * @var Color 存放具体颜色类的实例
     */
    public $color;

    /**
     * @param Color $color 颜色实例
     */
    public function __construct(Color $color)
    {
        $this->color = $color;
    }

    abstract public function display();
}
2、Square.php 具体图形类——正方形
<?php
namespace app\bridge\controller;

class Square extends Graphics
{
    /**
     * @return mixed|void  调用颜色实例的set()方法,输出颜色
     */
    public function display()
    {
        echo "这是一个" ;
        echo $this->color->set();
        echo "正方形</br>";
    }
}
3、Triangle.php 具体图形类——三角形
<?php
namespace app\bridge\controller;

class Triangle extends Graphics
{
    // 同 Square类
}
4、Oval.php 具体图形类——椭圆形
<?php
namespace app\bridge\controller;

class Oval extends Graphics
{
    // 同 Square类
}
5、Color.php 抽象颜色类
<?php
namespace app\bridge\controller;

abstract class Color
{
    abstract public function set();
}
6、Red.php 具体颜色类——红色
<?php
namespace app\bridge\controller;

class Red extends Color
{
    // 设置颜色——红色
    public function set()
    {
        echo "红色的";
    }
}
7、Yellow.php 具体颜色类——黄色
<?php
namespace app\bridge\controller;

class Yellow extends Color
{
    // 同 Red类
}
8、Bule.php 具体颜色类——蓝色
<?php
namespace app\bridge\controller;

class Bule extends Color
{
    // 同 Red类
}
9、Test.php 测试
<?php
namespace app\bridge\controller;

class Test
{
    // 测试
    public function test()
    {
        $square = new Square(new Red());            // 产生:红色的正方形实例
        $square->display();                         // 输出:这是一个红色的正方形

        $square_yellow = new Square(new Yellow());  // 产生:黄色的正方形实例
        $square_yellow->display();                  // 输出:这是一个黄色的正方形</br>

        $triangle = new Triangle(new Bule());       // 产生:蓝色的三角形实例
        $triangle->display();                       // 输出:这是一个蓝色的三角形
    }
}

测试结果

【设计模式】桥接模式

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!