知识点
相关文章
更多最近更新
更多设计模式之桥接模式
2019-03-02 00:54|来源: 网路
1 概述
桥接模式(Bridge),是把抽象和具体的实现分离开,使得二者可以独立扩展,不会影响到对方。当需要不同的方式去改变接口和实现时,就能体现出桥接模式的功效。
2 示例
直接这么说,显得有点不太好理解。Bridge就是桥,用于连接抽象和具体实现,过了桥,就该干嘛干嘛,两不相干。
依然以手机为例,手机浏览到好看的网页或者听到好听的歌曲、好看的视频等都想分享给自己的好友,可以分享到微信好友群中,也可以分享给QQ好友等。这个场景就适合桥接模式。
首先定义一个手机端信息分享的接口:
1 package org.scott.bridge; 2 /** 3 * @author Scott 4 * @date 2013-12-10 5 * @description 6 */ 7 public interface Share { 8 public abstract void shareMessage(); 9 }
通过这个接口,我们既可以分享网页信息(我就经常把知乎上的文章分享到微信),也可以分享音乐、视频等。先来个分享网页的实现:
1 package org.scott.bridge; 2 /** 3 * @author Scott 4 * @date 2013-12-10 5 * @description 6 */ 7 public class WebPageShare implements Share { 8 9 @Override 10 public void shareMessage() { 11 System.out.println("Share a web page."); 12 } 13 14 }
然后是分享音乐的实现:
1 package org.scott.bridge; 2 /** 3 * @author Scott 4 * @date 2013-12-10 5 * @description 6 */ 7 public class MusicShare implements Share { 8 9 @Override 10 public void shareMessage() { 11 System.out.println("Share a fair-sounding song."); 12 } 13 14 }
有了这两个具体的分享实现,剩下的就是分享到哪里去的问题了,现在有QQ群、微信好友圈、易信好友、来往。。。这么多不同的圈子,这里就要先定义一个用于供各个不同软件分享的抽象类,也就是开始说的“Bridge”,用于连接要分享的信息。
1 package org.scott.bridge; 2 /** 3 * @author Scott 4 * @date 2013-12-10 5 * @description 6 */ 7 public abstract class ShareBridge { 8 public Share share; 9 10 public ShareBridge(Share share){ 11 this.share = share; 12 } 13 14 public abstract void shareMessage(); 15 }
这个抽象类中就包含了Share这个接口,用于表示分享什么类型的内容。
然后呢?来个微信的分享吧:
1 package org.scott.bridge; 2 /** 3 * @author Scott 4 * @date 2013-12-10 5 * @description 6 */ 7 public class WeixinShare extends ShareBridge { 8 9 public WeixinShare(Share share) { 10 super(share); 11 } 12 13 @Override 14 public void shareMessage() { 15 this.share.shareMessage(); 16 System.out.println("To Weixin."); 17 } 18 19 }
当然,同是Tencent门派的大师兄QQ也不能落伍啊,QQ分享:
1 package org.scott.bridge; 2 /** 3 * @author Scott 4 * @date 2013-12-10 5 * @description 6 */ 7 public class QQShare extends ShareBridge { 8 9 public QQShare(Share share) { 10 super(share); 11 } 12 13 @Override 14 public void shareMessage() { 15 this.share.shareMessage(); 16 System.out.println("To QQ."); 17 } 18 19 }
有了各种前提条件,下面就是用户来分享自己的内容给一众好友了,测试类准备:
1 package org.scott.bridge; 2 /** 3 * @author Scott 4 * @date 2013-12-10 5 * @description 6 */ 7 public class BridgeTest { 8 9 public static void main(String[] args) { 10 Share webShare = new WebPageShare(); 11 Share musicShare = new MusicShare(); 12 13 ShareBridge weiXinShare = new WeixinShare(webShare); 14 ShareBridge qqShare = new QQShare(musicShare); 15 16 weiXinShare.shareMessage(); 17 System.out.println("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); 18 qqShare.shareMessage(); 19 } 20 21 }
看看分享的结果都是神马:
Share a web page. To Weixin. ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Share a fair-sounding song. To QQ.
上面就是桥接模式的小示例。
转自:http://www.cnblogs.com/Scott007/p/3468308
相关问答
更多-
Linux虚拟机如何设置桥接模式上网?[2022-08-04]
VM虚拟机软件为用户提供了3种可选的网络模式,分别为桥接模式、NAT模式与仅主机模式。 桥接模式:相当于在物理主机与虚拟机网卡上架设了一座桥梁,从而可以通过物理主机的网卡访问外网。 NAT模式:让VM虚拟机的网络服务起到路由器的作用,使得虚拟机软件内的主机可以通过物理主机访问外网,在真机电脑中对应的物理网卡是VMnet8。 仅主机模式:仅让虚拟机内的主机与物理主机通信,不能访问外网,在真机电脑中对应的物理网卡是VMnet1。 根据下图可进行对应的设置: 更虚拟机安装Linux系统详细的教程请参考《Linux ... -
java23个设计模式有哪些[2022-04-07]
一共23种设计模式! 引用《软件秘笈-设计模式那点事》书籍: 按照目的来分,设计模式可以分为创建型模式、结构型模式和行为型模式。 创建型模式用来处理对象的创建过程;结构型模式用来处理类或者对象的组合;行为型模式用来对类或对象怎样交互和怎样分配职责进行描述。 创建型模式用来处理对象的创建过程,主要包含以下5种设计模式: 工厂方法模式(Factory Method Pattern) 抽象工厂模式(Abstract Factory Pattern) 建造者模式(Builder Pattern) 原 ... -
.NET的24个设计模式有哪些?[2022-01-23]
设计模式什么语言都一样 如果楼主最关心C#的 那我建议楼主看一本书《敏捷软件开发 原则、模式与实践》 作者Robert C Martin 和 Micah Martin 非常好的讲解 -
求大神对下面几个面向对象的设计模式举出例子(什么类型都可以),谢谢[2022-06-13]
例子可能一两句话说不清楚,不过我给你推荐一本关于设计模式的基本教程《设计模式精解》,这本书是根据实际的问题,然后推理出各种设计模式的。 关于你说的这几种模式,这本书上都有介绍,你可以好好看看。 -
MVC模式和工厂模式都是属于设计模式吗?[2022-01-14]
都是设计模式,mvc是一种复合的模式,工厂是基本 -
B观察者(Observer) ============================= 观察者模式与MVC模式的关系: 1. MVC属于架构模式,一个架构模式描述了软件系统里的基本结构或者纲要。在MVC模式里面有三个角色:模型(model),视图(view),和控制器(controller). 2. 观察者模式可以用来实现MVC模式。观察者模式中的主题角色便是MVC模式中的模型角色加控制器角色。而观察者角色便是MVC模式中的视图角色。 希望对你有所帮助。^_^
-
.NET的24个设计模式有哪些?[2023-07-02]
创建型模式... 1. Abstract Factory.. 2提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。 2. Builder 2 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 3. Factory Method.. 3定义一个用于创建对象的接口,让子类决定实例化哪一个类。使一个类的实例化延迟到其子类。 4. Prototype.. 3用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 5. Singleton. 3 保证一个类仅有一个实 ... -
对于imps = new SystemImpl(sys); ,编译器抱怨SystemImpl没有以System作为参数的构造函数。 你可能想要 System::System(const System& sys) { imps = new SystemImpl(*sys.imps); } For imps = new SystemImpl(sys);, the compiler complains that SystemImpl doesn't have a constructor taking S ...
-
我没有意识到我需要vagrant up所以Vagrantfile中的更改可以生效。 I did not realize that I needed to vagrant up so the changes in Vagrantfile can take in effected.
-
@ Martin的评论让我想到多线程部分。 我得到了这个工作: 确保在BundleActivator调用ctx.lookup(...) 。 这是因为,在桥接模式下,运行Activator代码的线程的ClassLoader可以查找父WAR文件中定义的所有类和资源。 确保父WAR的META-INF/context.xml通过
公开JNDI资源 @Martin's c ...