设计模式之桥接模式

2019-03-02 00:55|来源: 网路

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/riasky/p/3469129

相关问答

更多
  • VM虚拟机软件为用户提供了3种可选的网络模式,分别为桥接模式、NAT模式与仅主机模式。 桥接模式:相当于在物理主机与虚拟机网卡上架设了一座桥梁,从而可以通过物理主机的网卡访问外网。 NAT模式:让VM虚拟机的网络服务起到路由器的作用,使得虚拟机软件内的主机可以通过物理主机访问外网,在真机电脑中对应的物理网卡是VMnet8。 仅主机模式:仅让虚拟机内的主机与物理主机通信,不能访问外网,在真机电脑中对应的物理网卡是VMnet1。 根据下图可进行对应的设置: 更虚拟机安装Linux系统详细的教程请参考《Linux ...
  • 一共23种设计模式! 引用《软件秘笈-设计模式那点事》书籍: 按照目的来分,设计模式可以分为创建型模式、结构型模式和行为型模式。 创建型模式用来处理对象的创建过程;结构型模式用来处理类或者对象的组合;行为型模式用来对类或对象怎样交互和怎样分配职责进行描述。 创建型模式用来处理对象的创建过程,主要包含以下5种设计模式:  工厂方法模式(Factory Method Pattern)  抽象工厂模式(Abstract Factory Pattern)  建造者模式(Builder Pattern)  原 ...
  • 设计模式什么语言都一样 如果楼主最关心C#的 那我建议楼主看一本书《敏捷软件开发 原则、模式与实践》 作者Robert C Martin 和 Micah Martin 非常好的讲解
  • 例子可能一两句话说不清楚,不过我给你推荐一本关于设计模式的基本教程《设计模式精解》,这本书是根据实际的问题,然后推理出各种设计模式的。 关于你说的这几种模式,这本书上都有介绍,你可以好好看看。
  • 都是设计模式,mvc是一种复合的模式,工厂是基本
  • B观察者(Observer) ============================= 观察者模式与MVC模式的关系: 1. MVC属于架构模式,一个架构模式描述了软件系统里的基本结构或者纲要。在MVC模式里面有三个角色:模型(model),视图(view),和控制器(controller). 2. 观察者模式可以用来实现MVC模式。观察者模式中的主题角色便是MVC模式中的模型角色加控制器角色。而观察者角色便是MVC模式中的视图角色。 希望对你有所帮助。^_^
  • 创建型模式... 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 ...