设计模式之桥接模式
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.
上面就是桥接模式的小示例。