深入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

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