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):实现的具体实现。

桥接模式的优势:

  • 分离抽象部分及其具体实现部分。
  • 提升了系统的扩展性。
  • 符合开闭原则。
  • 符合合成复用原则。

桥接模式的缺点:

  • 增长了系统的理解与设计难度。
  • 须要正确地识别系统中两个独立变化的维度。