设计模式 桥接模式

96 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 image.png

介绍

桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立变化。有独立存在,扩展性强的特点。应用在需要不断更换调用对象却执行相同的调用方法,实现扩展功能的场景。

角色

角色说明
Abstraction定义抽象类,并包含一个对实现化对象的引用
Refined Abstraction是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法
Implementor定义实现化角色的接口,供扩展抽象化角色调用
ConcreteImplementor给出实现化角色接口的具体实现

角色示例

类名担任角色说明
SizeAbstraction定义果茶杯子规格类,实现不用规格
NormalSizeRefined Abstraction定义正常杯类
BigSizeRefined Abstraction定义大杯类
SmallSizeRefined Abstraction定义小杯类
IceAbstraction定义冰量类,实现不用冰量
NormalIceRefined Abstraction定义正常冰类
LessIceRefined Abstraction定义少冰类
WithoutIceRefined Abstraction定义不加冰类
FruitTeaImplementor定义配置果茶的方法,来配置具体果茶
MangoTeaConcreteImplementor芒果茶类
StrawberryTeaConcreteImplementor草莓茶类

UML类图

image.png

代码

<?php  
interface Size{
    public function setSize();
}

class NormalSize implements Size
{
    public function setSize()
    {
        return '正常杯';
    }
}

class BigSize implements Size
{
    public function setSize()
    {
        return '大杯';
    }
}

class SmallSize implements Size
{
    public function setSize()
    {
        return '小杯';
    }
}

interface Ice{
    public function setIce();
}

class NormalIce implements Ice
{
    public function setIce()
    {
        return '正常杯';
    }
}

class LessIce implements Ice
{
    public function setIce()
    {
        return '少冰';
    }
}

class WithoutIce implements Ice
{
    public function setIce()
    {
        return '不加冰';
    }
}

abstract class FruitTea{
    protected $size; 
    protected $ice; 

    public function __construct(Size $size, Ice $ice)
    {
        $this->size = $size;
        $this->ice = $ice;
    }

    abstract public function getTea();
}

class MangoTea extends FruitTea
{
    public function getTea()
    {
        return "芒果茶".$this->size->setSize().$this->ice->setIce();
    }
}

class StrawberryTea extends FruitTea
{
    public function getTea()
    {
        return "草莓茶".$this->size->setSize().$this->ice->setIce();
    }
}

$bigSize = new BigSize();
$withoutIce = new WithoutIce();
$mangoTea = new MangoTea($bigSize, $withoutIce);
echo $mangoTea->getTea();

创建 FruitTea.php,内容如上。

执行

$ php FruitTea.php
芒果茶大杯不加冰