[设计模式] 桥接模式
一、任务
有三种图形:正方形、三角形、椭圆形
有三种颜色:红色、蓝色、黄色
任意搭配:比如红色的正方形、蓝色的椭圆形、蓝色的三角形等等
二、分析
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 协议》,转载必须注明作者和本文链接