在编程中,我们会经常遇见多层级分支的情况,显然用继承是不合适的,子类和父类的耦合过高会给后期代码的维护带来极大的麻烦,为了解决这个问题,我们可以使用桥接模式。简单来说,桥接模式就是将每个分支单独分开,然后通过委托调用的方式实现桥接。下面通过一个例子来演示桥接模式的用法。
在不同的系统中,系统服务的运行是不一样的,而不同的软件又依赖不同的服务。假设现在我们有ios和android两个系统,有wlan和media两个系统服务,有美颜相机,本地视频播放器,微信,优酷视频4个app,美颜相机和本地视频播放器依赖media服务,微信和优酷视频依赖wlan服务。可以看出,我们将会有三个分支,层级依次是:系统->服务->软件,每个分支包含一个抽象类和具体类。
首先定义系统层级的分支:
abstract class system{
public $service;
//设置系统想要启动的服务
function setService(service $service){
$this->service=$service;
}
abstract function run();
}
class ios extends system {
function run()
{
echo "ios:<br>";
//启动服务
$this->service->start();
}
}
class android extends system {
function run(){
echo "android:<br>";
$this->service->start();
}
}
定义系统服务层级分支:
abstract class service{
public $app;
//设置依赖于该服务且要运行的软件
function setApp(app $app){
$this->app=$app;
}
abstract function start();
}
class wlan extends service {
function start()
{
echo "开启wlan服务<br>";
//运行软件
$this->app->run();
}
}
class media extends service {
function start()
{
echo "开启多媒体服务<br>";
$this->app->run();
}
}
定义app层级分支
abstract class app{
abstract function run();
}
class meiyan extends app {
function run()
{
echo "运行美颜相机<br>";
}
}
class wechat extends app {
function run()
{
echo "运行微信<br>";
}
}class youku extends app {
function run()
{
echo "运行优酷视频<br>";
}
}class localPlayer extends app {
function run()
{
echo "运行本地播放器<br>";
}
}
$ios=new ios();
$android=new android();
$wlan=new wlan();
$media=new media();
$youku=new youku();
$meiyan=new meiyan();
//设置ios系统要启动的服务和运行的软件
$ios->setService($wlan);
$wlan->setApp($youku);
//设置android系统要启动的服务和运行的软件
$android->setService($media);
$media->setApp($meiyan);
$ios->run();
echo "<hr>";
$android->run();
运行结果如图:
当我们需要在对应的层级增加分支时,只需要添加对应的继承抽象层级类的子类即可,当需要添加层级的时候,我们只需要在上一层级中添加新层级类型的对象属性和设置该对象属性的方法,然后在上一层级的运行方法中在运行上一层级的处理代码后添加调用新层级运行方法。
当你的代码中需要处理多层级分支的情况时,记得桥接模式。