桥接模式是软件设计模式中最复杂的模式之一,它把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化。
事物对象仅是一个抽象的概念。如“圆形”、“三角形”归于抽象的“形状”之下,
而“画圆”、“画三角”归于实现行为的“画图”类之下,然后由“形状”调用“画图”。
1,如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
2,抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
3,虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
- 个人理解
比如每个手机是单独封装好的类,手机的每个声音是单独封装好的类
桥接模式是需要把抽象的手机
,与行为声音
,组合在一起
此处还是使用慕课网的demo
<?php
//抽象化角色
abstract class MiPhone
{
protected $_audio; //存放音频软件对象
abstract function output();
public function __construct(Audio $audio)
{
$this->_audio = $audio;
}
}
//具体手机
class Mix extends MiPhone
{
//语音输出功能
public function output()
{
$this->_audio->output();
}
}
class Note extends MiPhone
{
public function output()
{
$this->_audio->output();
}
}
//实现化角色 功能实现者
abstract class Audio
{
abstract function output();
}
//具体音频实现者 -骨传导音频输出
class Osteophony extends Audio
{
public function output()
{
echo "骨传导输出的声音-----哈哈" . PHP_EOL;
}
}
//普通音频输出---声筒输出
class Cylinder extends Audio
{
public function output()
{
echo "声筒输出的声音-----呵呵" . PHP_EOL;
}
}
//让小米mix和小米note输出声音
$mix = new Mix(new Osteophony);
$mix->output();
$note = new Note(new Cylinder);
$note->output();
网友评论