深入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.OAMessgaeBridge;

public class ClientForOAMessageBridge
{
    public static void main(String[] args)
    {
        MessageImplementor messageImplementor = new MessageSMS();
        AbstractMessage message = new CommonMessage(messageImplementor);
        message.sendMessage("请喝杯茶", "小李");
        message = new UrgencyMessage(messageImplementor);
        message.sendMessage("请喝杯茶", "小李");
        message = new SpecialUrgencyMessage(messageImplementor);
        message.sendMessage("请喝杯茶", "小李");

        messageImplementor = new MessageMobile();
        message = new CommonMessage(messageImplementor);
        message.sendMessage("请喝杯茶", "小李");
        message = new UrgencyMessage(messageImplementor);
        message.sendMessage("请喝杯茶", "小李");
        message = new SpecialUrgencyMessage(messageImplementor);
        message.sendMessage("请喝杯茶", "小李");
    }
}
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章