设计模式专题(十八) ——桥接模式

设计模式专题(十八)——桥接模式

(原创内容,转载请注明来源,谢谢)

一、概述

桥接模式(Bridge)将抽象部分与实现部分分离,使每一部分之间互相独立化,使类之间可以组合起来使用,而不是继承的方式使用。

当某个类,可以通过不同的分类方式进行分类,例如手机,可以通过品牌分类、通过软件分类。当着两个维度对手机进行分类时,无法确定哪一类是主类,无论对什么分类进行处理,都会出现另一个维度的分类处理起来很复杂。

此时就需要使用桥接模式进行处理。

二、类图

三、比较

1、桥接模式和适配器模式

适配器模式主要是用于将两个完全无关的类,通过编写一个转接的接口,实现两个类的结合;而桥接模式主要是讲相关的类通过一定关系组合起来。

2、桥接模式和抽象工厂模式

抽象工厂模式主要是通过创建一系列的工厂对象,将一个类具体化扩充;桥接模式主要是通过组合,将不同的功能配合在一起。这两个模式通常可以共用。

四、设计实现

1、业务需求

按照上述的手机,不同的手机操作系统、不同的软件,两个维度进行划分,实现灵活的设计方案。

2、设计方案

1)手机品牌抽象类

2)手机软件抽象类

3)手机品牌具体类

4)手机软件具体类

5)客户端调用

3、PHP实现

<?php
//桥接模式——实现手机软件和手机品牌的桥接
//手机品牌抽象类
abstract class PhoneBrand{
         private$arrPhoneSoft;//用于装载软件
         publicfunction __construct(array $arrPhoneSoft = array()){
                   $this->arrPhoneSoft= array();
                   if(!empty($arrPhoneSoft)){
                            foreach($arrPhoneSoftas $soft){
                                     if($softinstanceof PhoneSoft){
                                               array_push($this->arrPhoneSoft,$soft);
                                     }
                            }                          
                   }
         }
         //提供添加软件功能
         publicfunction addSoft(PhoneSoft $soft){
                   array_push($this->arrPhoneSoft,$soft);
                   return$this->arrPhoneSoft;
         }
         publicfunction addSoftBatch(array $arrPhoneSoft){
                   if(empty($arrPhoneSoft)){
                            return$this->arrPhoneSoft;
                   }
                   foreach($arrPhoneSoftas $soft){
                            if($softinstanceof PhoneSoft){
                                     $this->addSoft($soft);
                            }
                   }
                   return$this->arrPhoneSoft;
         }
}
//手机软件抽象类
abstract class PhoneSoft{
         publicfunction run(){}//具备运行功能
}
//手机具体品牌
class PhoneBrandA extends PhoneBrand{
         private$arrPhoneSoft;//用于装载软件
         publicfunction __construct(array $arrPhoneSoft = array()){
                   parent::__construct($arrPhoneSoft);
         }
}
//手机软件具体类
class PhoneSoftA extends PhoneSoft{
         publicfunction run(){
                   echo'PhoneSoftA running';
         }
}
//客户端调用
$myPhone = new PhoneBrandA(array(newPhoneSoftA()));
$myPhone->arrPhoneSoft[0]->run();

——written by linhxx 2017.08.16

相关阅读:

设计模式专题(十七) ——单例模式

设计模式专题(十六)——迭代器模式

设计模式专题(十五) ——组合模式

设计模式专题(十四)——适配器模式

设计模式专题(十三) ——备忘录模式

设计模式专题(十二)——状态模式

设计模式专题(十一)——抽象工厂模式

设计模式专题(十)——观察者模式

设计模式专题(九) ——外观模式

设计模式专题(八) ——模板方法模式

设计模式专题(七)——建造者模式

设计模式专题(六)——原型模式

设计模式专题(五)——工厂方法模式

设计模式专题(四)——代理模式

设计模式专题(三)——装饰模式

设计模式专题(二)——策略模式

设计模式专题(一)——面向对象的设计原则

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-08-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏知晓程序

这款小程序,想要和你一起「虚度时光」

一个人在家的时候,从来不敢在下午睡觉,因为,等你醒来,你就会发现屋内漆黑一片,屋外点点灯光,好像被世界抛弃了一样,孤独在那一刻表现的淋漓尽致。

381
来自专栏数据小魔方

你想要的地图素材资源,我都帮你整理好了~

这一篇我会把自己所掌握的所有数据地图素材资源获取途径全部分享给大家。 可能有的小伙伴儿会有疑问,现在商务智能工具发展的这么火,像PowerBI、Tableau...

2703
来自专栏Sign

微信小游戏开发技巧

之前有幸收到掘金邀请去分享小游戏开发相关的技术主题,正好公众号一直也没有比较全面的和大家聊如何从技术层面做游戏,这里整理一下之前的分享ppt。

1265
来自专栏小狼的世界

YUI3 CSS框架学习

改变最大的我觉得是Grids部分,YUI2中以模版的方式提供给我们调用,功能中多选项也很多,而且配合Grid Build Tool,可以快速的生成复杂的页面结构...

903
来自专栏飞雪无情的博客

如何快速的开通公众号【原创】功能

2016年12底开通微信公众号[flysnow_org]后,就开始写文章,写了几篇后,发现了一个问题,怎么我的文章前面没有【原创】标记呢,别人的都有。

844
来自专栏Crossin的编程教室

微信小游戏“跳一跳”,Python“外挂”已上线

微信又一次不声不响地搞了个大事情: “小游戏”上线了! ? 于是,在这辞旧迎新的时刻,毫无意外的又火了。 今天有多少人刷了,让我看到你们的双手! ? 喏,我已经...

26710
来自专栏iOS开发攻城狮的集散地

iOS 自定义转场动画

2435
来自专栏知晓程序

有了微信小程序,你会卸载原生 App 吗?

1112
来自专栏直播系统开发

关于直播系统和短视频系统安卓手机屏幕适配的方向思路

直播与短视频的接踵而至,将互联网推向了网红经济时代,而智能手机的更新迭代为二者的发展提供了“温床”。但随着Android机型的增多,设备碎片化的程度也在不断加深...

920
来自专栏李嘉的专栏

分享一些有意思的极客设计和技术:荟萃001

极客是美国俚语“geek”的音译。随着互联网文化的兴起,这个词含有智力超群和努力的语意,又被用于形容对计算机和网络技术有狂热兴趣并投入大量时间钻研的人。本文给大...

800

扫码关注云+社区