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

【php设计模式】桥接模式

程序员文章站 2022-04-29 17:41:24
定义: 将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。 角色: 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父 ......

  定义:
  将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

  角色:
  抽象化(abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
  扩展抽象化(refined abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  实现化(implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
  具体实现化(concrete implementor)角色:给出实现化角色接口的具体实现。

  举例:

  车分为很多种(小轿车,公交车),并且每种车都会跑在不同的道路上(街道,高速路),如果使用继承的方式我们可以实现这些场景
  但是那样做的话会使得代码变得可扩展行很差,但是使用桥接模式就不一样啦

abstract class road{
    public $car;
    public function __construct(car $car){
        $this->car = $car;
    }
    public abstract function run();
}

class speedway extends road{
    public function run(){
        echo $this->car->name." run on speedway\n";
    }
}

class street extends road{
    public function run(){
        echo $this->car->name." run on street\n";
    }
}

abstract class car{
    public $name;
}

class smallcar extends car{
    public function __construct(){
        $this->name = "smallcar";
    }
}

class bus extends car{
    public function __construct(){
        $this->name = "bus";
    }
}

$small_car = new smallcar();
$speedway = new speedway($small_car);
$speedway->run();

$bus = new bus();
$street = new street($bus);
$street->run();

  使用场景:

  当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
  当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
  当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。