深入Java设计模式之桥接模式

简介: 深入Java设计模式之桥接模式

引入

JDBC是以统一方式访问数据库的API.是一种退化的桥接模式

它提供了独立于平台的数据库访问,也就是说,有了JDBC API,我们就不必为访问Oracle数据库专门写一个程序,为访问Sybase数据库又专门写一个程序等等,只需要用JDBC API写一个程序就够了,它可以向相应数据库发送SQL调用.JDBC是Java应用程序与各种不同数据库之间进行对话的方法的机制.

桥接模式原理

系统有多维角度分类时,而每一种分类又有可能变化,考虑使用桥接模式 桥接的目的是分离抽象与实现,使抽象和实现可以独立变化。

桥接模式的优点

(1)实现了抽象和实现部分的分离

桥接模式分离了抽象部分和实现部分,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,分别定义接口,这有助于系统进行分层设计,从而产生更好的结构化系统。对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了。

(2)更好的可扩展性

由于桥接模式把抽象部分和实现部分分离了,从而分别定义接口,这就使得抽象部分和实现部分可以分别独立扩展,而不会相互影响,大大的提供了系统的可扩展性。

(3)可动态的切换实现

由于桥接模式实现了抽象和实现的分离,所以在实现桥接模式时,就可以实现动态的选择和使用具体的实现。

(4)实现细节对客户端透明,可以对用户隐藏实现细节。

桥接模式的缺点

(1)桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。

(2)桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。

使用桥梁模式的场景

 

不用桥接模式的写法

package com.lzhsite.technology.designPattern.bridgems.OAMessage;
public interface Message
{
    public void send(String message, String toUser);
}
package com.lzhsite.technology.designPattern.bridgems.OAMessage;
public interface UrgencyMessage extends Message
{
    public Object monitor(String messageId);
}
package com.lzhsite.technology.designPattern.bridgems.OAMessage;
public class UrgencyMessageSMS implements UrgencyMessage
{
    public Object monitor(String messageId)
    {
        return null;
    }
    public void send(String message, String toUser)
    {
        message = "加急:" + message;
        System.out.println("使用系统内短消息的方法,发送消息 '" + message + "' 给 " + toUser);
    }
}
package com.lzhsite.technology.designPattern.bridgems.OAMessage;
public class UrgencyMessageEmail implements UrgencyMessage
{
    public Object monitor(String messageId)
    {
        return null;
    }
    public void send(String message, String toUser)
    {
        message = "加急:" + message;
        System.out.println("使用邮件短消息的方法,发送消息 '" + message + "' 给 " + toUser);
    }
}
package com.lzhsite.technology.designPattern.bridgems.OAMessage;
public class CommonMessageSMS implements Message
{
    public void send(String message, String toUser)
    {
        System.out.println("使用系统内短消息的方法,发送消息 '" + message + "' 给 " + toUser);
    }
}
package com.lzhsite.technology.designPattern.bridgems.OAMessage;
public class CommonMessgaeEmail implements Message
{
    public void send(String message, String toUser)
    {
        System.out.println("使用邮件短消息的方法,发送消息 '" + message + "' 给 " + toUser);
    }
}

 

用桥接模式的写法:

package com.lzhsite.technology.designPattern.bridgems.OAMessage;
public class CommonMessgaeEmail implements Message
{
    public void send(String message, String toUser)
    {
        System.out.println("使用邮件短消息的方法,发送消息 '" + message + "' 给 " + toUser);
    }
}
package com.lzhsite.technology.designPattern.bridgems.OAMessgaeBridge;
public abstract class AbstractMessage
{
    protected MessageImplementor impl;
    protected AbstractMessage(MessageImplementor impl)
    {
        this.impl = impl;
    }
    public void sendMessage(String message, String toUser)
    {
        this.impl.send(message, toUser);
    }
}
package com.lzhsite.technology.designPattern.bridgems.OAMessgaeBridge;
public class SpecialUrgencyMessage extends AbstractMessage
{
    protected SpecialUrgencyMessage(MessageImplementor impl)
    {
        super(impl);
    }
    public void hurry(String messageId)
    {
    }
    public void sendMessage(String message, String toUser)
    {
        message = "特急:" + message;
        super.sendMessage(message, toUser);
    }
}
package com.lzhsite.technology.designPattern.bridgems.OAMessgaeBridge;
public class CommonMessage extends AbstractMessage
{
    protected CommonMessage(MessageImplementor impl)
    {
        super(impl);
    }
    public void sendMessage(String message, String toUser)
    {
        super.sendMessage(message, toUser);
    }
}
package com.lzhsite.technology.designPattern.bridgems.OAMessgaeBridge;
public interface MessageImplementor
{
    public void send(String message, String toUser);
}
package com.lzhsite.technology.designPattern.bridgems.OAMessgaeBridge;
public class MessageMobile implements MessageImplementor
{
    public void send(String message, String toUser)
    {
        System.out.println("使用手机短消息的方法,发送消息 '" + message + "' 给 " + toUser);
    }
}
package com.lzhsite.technology.designPattern.bridgems.OAMessgaeBridge;
public class MessageSMS implements MessageImplementor
{
    public void send(String message, String toUser)
    {
        System.out.println("使用系统内短消息的方法,发送消息 '" + message + "' 给 " + toUser);
    }
}

示例代码

https://gitee.com/lzhcode/maven-parent/tree/master/lzh-technology/src/main/java/com/lzhsite/technology/designPattern/bridgems


相关文章
|
1天前
|
设计模式 SQL 安全
Java设计模式:单例模式之六种实现方式详解(二)
Java设计模式:单例模式之六种实现方式详解(二)
11 3
|
21小时前
|
设计模式 算法 搜索推荐
Java设计模式之策略模式详解
Java设计模式之策略模式详解
|
21小时前
|
设计模式 Java 机器人
Java设计模式之访问者模式详解
Java设计模式之访问者模式详解
|
1天前
|
设计模式 Java
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
6 2
|
1天前
|
设计模式 算法 Java
Java设计模式:核心概述(一)
Java设计模式:核心概述(一)
9 2
|
18小时前
|
设计模式 Java uml
必知的技术知识:JAVA【设计模式】命令模式
必知的技术知识:JAVA【设计模式】命令模式
|
21小时前
|
设计模式 Java 机器人
Java设计模式之状态模式详解
Java设计模式之状态模式详解
|
21小时前
|
设计模式 算法 Java
Java设计模式之模板方法模式详解
Java设计模式之模板方法模式详解
|
1天前
|
设计模式 存储 安全
Java设计模式:组合模式之透明与安全的两种实现(七)
Java设计模式:组合模式之透明与安全的两种实现(七)
11 0
|
1天前
|
设计模式 Java
Java设计模式:深入装饰器模式的三种写法(六)
Java设计模式:深入装饰器模式的三种写法(六)
5 0