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

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

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

一、概述

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

相关文章

来自专栏无题

各RDB与Nosql性能与特点总结

最近考虑到数据库包括各种缓存到底面对高并发情况性能到底是怎么样的,所以多方收集整理成此篇,以后也会持续更新。 mysql: 1.性能从10万条规模升到100万...

38210
来自专栏架构师之路

工作线程数究竟要设置为多少 | 架构师之路

一、需求缘起 Web-Server通常有个配置,最大工作线程数,后端服务一般也有个配置,工作线程池的线程数量,这个线程数的配置不同的业务架构师有不同的经验值,...

3698
来自专栏乐沙弥的世界

Oracle自动性能统计

  高效诊断性能问题,需要提供完整可用的统计信息,好比医生给病人看病的望闻问切,才能够正确的确诊,然后再开出相应的药方。Oracle数据库为系统、会话以及单独的...

800
来自专栏架构师之路

数据库软件架构设计些什么

缘起:受@萧田国 萧总邀请,上周五晚上在“高效运维1号群”内分享了《58同城数据库软件架构设计与实践》(这个topic今年在数据库大会上分享过),应组织方要求,...

34111
来自专栏IT笔记

分布式与集群有什么区别

一个是3个字,另一个2个字 集群一般被分为三种类型,高可用集群(High-availability (HA) clusters )如RHCS、LifeKeepe...

3504
来自专栏架构说

man epoll的惊喜

今日问题: 0.1ms socket a 过来一起个请求 a 0.2ms socket b 过来一起个请求 b epoll_wait 返回结果是什么 我...

3468
来自专栏架构师之路

线程数究竟设多少合理

一、需求缘起 Web-Server通常有个配置,最大工作线程数,后端服务一般也有个配置,工作线程池的线程数量,这个线程数的配置不同的业务架构师有不同的经验值,...

3186
来自专栏PHP技术

NoSQL数据库的分布式算法

原文出处: highlyscalable.wordpress.com 译文出处:juliashine 系 统的可扩展性是推动NoSQL运动发展的的主要...

3225
来自专栏Java Edge

Java并发编程实战系列11之性能与可伸缩性Performance and Scalability

线程可以充分发挥系统的处理能力,提高资源利用率。同时现有的线程可以提升系统响应性。 但是在安全性与极限性能上,我们首先需要保证的是安全性。 11.1 对性能的...

3385
来自专栏腾讯大数据的专栏

大型web系统数据缓存设计

1. 前言 在高访问量的web系统中,缓存几乎是离不开的;但是一个适当、高效的缓存方案设计却并不容易;所以接下来将讨论一下应用系统缓存的设计方面应该注意哪些...

2526

扫描关注云+社区