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

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

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

一、概述

桥接模式(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 条评论
登录 后参与评论

相关文章

来自专栏HansBug's Lab

算法模板——Dinic网络最大流 1

实现功能:同sap网络最大流 今天第一次学Dinic,感觉最大的特点就是——相当的白话,相当的容易懂,而且丝毫不影响复杂度,顶多也就是代码长个几行 主要原理就是...

2978
来自专栏养码场

若你想入职面试阿里系公司,不妨看看这位资深Java的面试经

上上周分享了占小狼面试阿里系的面经文章:《一位资深Java的阿里系公司实战面试经验,套路还是面试官的多》 ,蛮受大家欢迎的。看到大家在社群里的好评与点赞,占小狼...

1632
来自专栏前端黑板报

Vue列表循环从指定下标开始

最近遇到一个问题,在循环商品列表时,因为数组的第一个是商品的品牌介绍,所以循环时不能直接循环,只能从第二个元素开始。

9353
来自专栏C语言及其他语言

[每日一题]C语言程序设计教程(第三版)课后习题5.6

题目描述 给出一百分制成绩,要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。 90分以上为A 80-89分为B 70-79分为C 60-69分为D 60...

3145
来自专栏spring源码深度学习

java核心技术——Exception和Error的区别

Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者...

1491
来自专栏陈树义

我是SPI,我让框架更加优雅了!

自从上次小黑进入公司的架构组之后,小黑就承担起整个公司底层框架的开发工作。就在刚刚,小黑又接到一个任务:做一个通用的歌曲信息解析框架。即输入歌曲数据,之后返回该...

771
来自专栏精讲JAVA

Gof设计模式之静态工厂模式(五)

设计模式之静态工厂模式 01前言 该系列模式已经更新五篇,希望大家可以多看看以前的模式,并且从今天开始我打算换一种讲解方式,我不在贴出运行结果...

1996
来自专栏张善友的专栏

微软在动态语言支持上超越了Java?

当.NET在2000/2001年第一次发布的时候,Java社区认为它仅仅是从语言以及标准库上对Java的一个“克隆”。我们把二者的简单实例代码进行比较以后就可以...

18310
来自专栏韩伟的专栏

面向对象的代码风格(上)

大家过年好呀!公众号从今天开始恢复更新,感谢大家不离不弃的关注。 今天的文末有投票,以助于我在新的一年里将公众号做得更好,踊跃参加一下吧! 本篇文章分两章发送,...

3908
来自专栏Java架构

每个 JavaScript 工程师都应当知道的 10 个面试题以人为本1. 能说出来两种对于 JavaScript 工程师很重要的编程范式么?2. 什么是函数式编程?3. 类继承和原型继承有什么区别?

2716

扫码关注云+社区