桥接模式

来源:互联网 发布:淘宝 产品对比 违规 编辑:程序博客网 时间:2024/06/10 01:13

                                                                                                               桥接模式

一:桥接模式引入背景

        设计模式是为了更好的解决面向对象编程中的耦合问题,就是提供一种解决特定上下文环境中的解决方案.那么我们来分析一下下面这种案例: 抽象出一个关系系---> 事物+功能=服务
生活中有一类事物集合:设为A1,A2,A3等事物,每个事物都有F1,F2,F3,F4,F5等多种功能,将事物和功能结合起来就可以组成服务了的.但是为了提供这样的服务,我们要编写多少类?计算一下,m*n个,而且耦合度较高,灵活度下降了太多.为此就来解决这个实际问题,给出一个非常合理的解决方案.这个就是著名的桥接模式.
这种设计模式的核心就是将抽象部分和实现部分进行灵活的进行组合.两种核心的部分就是事物+功能,下面就来从这两个部分进行分析实现.
二:案例实现
这里以大家非常熟悉的腾讯公司的QQ和微信两款即时聊天工具来分析.
1:简单分析一下,我们要实现的业务,就是腾讯公司提供的大家的聊天服务.
2:简单分析抽象出聊天的接口 展示源代码
public interface Communication {      /**       * 聊天接口方法       */void communication(String type);}
3:微信实现聊天功能
public class WeiXinCommunication implements Communication {@Overridepublic void communication(String type) {          System.out.println("腾讯旗下微信提供"+type+"聊天功能!");}   }
4:QQ实现聊天功能
public class QqCommunication implements Communication {@Overridepublic void communication(String type) {System.out.println("腾讯旗下QQ提供"+type+"聊天功能!");}}
5:桥接类
public abstract class AbstractCommunication {/** * 具有聊天的功能 */    private Communication communication;        /**     * 初始化桥接抽象类     * @param communication     */    public AbstractCommunication(Communication communication){    this.communication=communication;    }        /**     * 回调聊天方法     */    public void communication(String type){    communication.communication(type);    }  }
6:发送文本消息的类
public class TextMessage extends AbstractCommunication {    public TextMessage(Communication communication) {super(communication);// TODO Auto-generated constructor stub}}
7:发送语音消息的类
public class VoiceMessage extends AbstractCommunication {public VoiceMessage(Communication communication) {super(communication);// TODO Auto-generated constructor stub}}
8:发送视频消息的类
public class VideoMessage extends AbstractCommunication {public VideoMessage(Communication communication) {super(communication);// TODO Auto-generated constructor stub}  }
9:测试桥接模式
public class TestCommunication {public static void main(String[] args) {        Communication communication=new WeiXinCommunication();        TextMessage videoMessage=new TextMessage(communication);        videoMessage.communication("发送文本"); }}
测试运行截图如下:
分析实现过程的思路
那个接受消息类型的String type可以在用户测试的时候实现,有效的防止硬编码写死的问题.这样比较灵活的.这里分析核心的桥接类,那个类里面的成员变量如下:
 private Communication communication;
对就是没有看错就是这个接口变量,就帮助我们将事物类和功能类巧妙的连接在了一起,桥接模式由此得名.
既然说是为特定的问题提供一种解决方案,那么就要满足需求的动态变化.桥接模式的动态变化分两种情况,
第一:新添加了事物,比如后面腾讯公司有发布了更加便捷的即时聊天工具,我们怎么来实现业务呐?
只需要实现聊天接口即可,其他不用改变.
第二;新添加了一种发送消息的方式
只需要给桥接抽象类进行派生一个子类就可以了.