桥接模式

定义

桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式

主要角色

  • 抽象化(Abstraction)角色:定义抽象类的接口并保存一个对实现化对象的引用。
  • 修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
  • 实现化(Implementor)角色:定义实现类的接口,不给出具体的实现。此接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以完全不同。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
  • 具体实现化(Concrete Implementor)角色:实现实现化角色接口并定义它的具体实现。

应用场景

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

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<?php
/**
* Created by PhpStorm.
* User: Livfer
* Desc:
* Date: 2019/9/17
* Time: 09:25
*/

/**
* 道路抽象化角色
* Class Road
*/
abstract class Road
{
abstract public function run();
}

/**
* 修正抽象画角色
* Class HighSpeedWay
*/
class HighSpeedWay extends Road
{
protected $car;

public function __construct(Car $car)
{
$this->car = $car;
}

public function run()
{
return $this->car->run().'行驶在高速';
}
}

class Street extends Road
{
protected $car;

public function __construct(Car $car)
{
$this->car = $car;
}

public function run()
{
return $this->car->run();
}
}

/**
* 实现化抽象角色
* Class Car
*/
abstract class Car
{
abstract public function run();
}

/**
* 具体实现化角色
* Class SmallCar
*/
class SmallCar extends Car
{
public function run()
{
return '小轿车';
}
}

class Bus extends Car
{
public function run()
{
return '巴士';
}
}

$smallCar = new SmallCar();
$bus = new Bus();
$carWithHighSpeed = new HighSpeedWay($smallCar);
$busWithHighSpeed = new HighSpeedWay($bus);

$carWithStreet = new Street($smallCar);
$BusWithStreet = new Street($bus);

参考

[设计模式详解][http://yansu.org/2014/04/19/design-patterns-of-php.html]