java設計模式之橋接模式

橋接模式的定義:

  橋接模式又叫做橋樑模式、接口模式或柄體模式,指將抽象部分與具體實現部分分離,使它們均可以獨立的變化,屬於結構性模式。函數

橋接模式的主要目的是經過組合的方式創建兩個類之間的聯繫,而不是繼承,但又類是多重繼承方案。可是多重繼承方案每每違背了類測試

的單一職責原則,其複用性比較差,橋接模式是比多重繼承方案更好的替代方案。橋接模式的核心在於把抽象與實現解耦。this

橋接模式的運用場景:

  • 在抽象和具體實現之間須要增長更多靈活性的場景。
  • 一個類存在兩個或多個獨立變化的維度,而這兩個或多個維度都須要獨立進行擴展。
  • 不但願使用繼承,或由於多繼承致使系統類的個數劇增。

使用橋接模式設計稍複雜得消息系統:

  具給例子,咱們在平時辦公得時候常常經過郵件消息、短信消息、或者系統內消息與同時進行溝通。消息又會有緊急程度之分,分爲spa

普通消息、加急消息和特急消息。顯然,整個消息系統能夠劃分爲兩個維度,下面咱們來看看經過橋接模式如何解決這個問題,先建立一個設計

IMessage接口擔任橋接的角色類。code

public interface IMessage {
    //發送消息的內容和接收人
    void send(String message,String toUser);
}

建立郵件消息實現類EmailMessage類。blog

public class EmailMessage implements IMessage {
    public void send(String message, String toUser) {
        System.out.println("使用郵件消息發送" + message + "給" + toUser);
    }
}

建立短線消息實現類SmsMessage類。繼承

public class SmsMessage implements IMessage {
    public void send(String message, String toUser) {
        System.out.println("使用短信消息發送" + message + "給" + toUser);
    }
}

建立橋接抽象角色AbastractMessage類。接口

public abstract class AbastractMessage {
    private IMessage message;

    public AbastractMessage(IMessage message) {
        this.message = message;
    }
    void sendMessage(String message,String toUser){
        this.message.send(message,toUser);
    }
}

建立具體實現普通消息NomalMessage類。ast

public class NomalMessage extends AbastractMessage {
public NomalMessage(IMessage message) {
super(message);
}

void sendMessage(String message, String toUser){
message = "【普通】" + message;
super.sendMessage(message,toUser);
}
}

建立具體實現加急消息UrgencyMessage類。

public class UrgencyMessage extends AbastractMessage {
    public UrgencyMessage(IMessage message) {
        super(message);
    }

    void sendMessage(String message, String toUser){
        message = "【加急】" + message;
        super.sendMessage(message,toUser);
    }

    public Object watch(String messageId){
        return null;
    }
}

測試代碼。

public class Test {
    public static void main(String[] args) {
        IMessage message = new SmsMessage();
        AbastractMessage abastractMessage = new NomalMessage(message);
        abastractMessage.sendMessage("加班申請","王總");

        message = new EmailMessage();
        abastractMessage = new UrgencyMessage(message);
        abastractMessage.sendMessage("加班申請","王總");
    }

}

測試結果以下:

 

 來看看對應的UML類圖:

 

 由上圖能夠看到,橋接模式主要包含4個角色.

  1. 抽象(AbastractMessage):該類持有一個對實現角色(IMessage)的引用,抽象角色中的方法須要實現角色來實現。抽象角色通常爲抽象類(構造函數規定子類要傳入一個實現實例)。
  2. 修正抽象(UrgencyMessage和NomalMessage); 抽象的具體實現,對抽象的方法進行完善和擴展。
  3. 實現(IMessage):肯定實現維度的基本操做,提供給抽象使用。該類通常爲接口或者抽象類。
  4. 具體實現(EmailMessage和UrgencyMessage):實現的具體實現。

橋接模式的優勢:

  • 分離抽象部分及其具體實現部分。
  • 提升了系統的擴展性。
  • 符合開閉原則。
  • 符合合成複用原則。

橋接模式的缺點:

  • 增長了系統的理解與設計難度。
  • 須要正確地識別系統中兩個獨立變化的維度。
相關文章
相關標籤/搜索