• 设计模式之桥接模式


    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("
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ");
    18         qqShare.shareMessage();
    19     }
    20 
    21 }

        看看分享的结果都是神马:

    Share a web page.
    To Weixin.
    
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    Share a fair-sounding song.
    To QQ.

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

  • 相关阅读:
    [Python]计算豆瓣电影TOP250的平均得分
    [Golang]使用自建代理访问指定网站
    HDU 2689.Sort it-冒泡排序
    HDU 1728.逃离迷宫-BFS
    hihoCoder #1498.Diligent Robots
    POJ 2503.Babelfish-sscanf()函数+strcmp()函数+二分
    Codeforces 608 B. Hamming Distance Sum-前缀和
    Codeforces 608 A. Saitama Destroys Hotel
    sscanf()函数
    UVA 11461.Square Numbers
  • 原文地址:https://www.cnblogs.com/Scott007/p/3468308.html
Copyright © 2020-2023  润新知