设计模式之桥接模式

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.

 

    上面就是桥接模式的小示例。

posted @ 2013-12-10 22:08  Scott007  阅读(705)  评论(0编辑  收藏  举报