桥接模式详解附有代码案例分析

471 阅读2分钟

这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战

一、桥接模式的概念和角色

(一)、桥接模式的概念

​ 桥接模式也称为桥梁模式。是将抽象部分与它的具体实现部分分离,使他们都可以独立地变化,属于结构型模式。

​ 桥接模式主要目的是通过组合的方式建立两个类之间的联系,而不是继承。但又类似于多重继承方案,但是多重继承方案往往违背类的单一职责原则,其复用性比较差,桥接模式是比多重继承更好的替代方案。桥接模式的核心在于解耦抽象和实现。

(二)、桥接模式的角色

​ 抽象(Abstraction):该类持有一个对实现角色的引用,抽象角色中的方法需要实现角色来实现。抽象角色一般为抽象类(构造函数规定子类要传入一个实现对象)。

​ 修正抽象(RefinedAbstraction):Abstraction的具体实现,对Abstraction的方法进行完善和扩展。

​ 实现(Implementor):确定实现维度的基本操作,提供给Abstraction使用。该类一般为接口或抽象类。

​ 具体实现(ConcreteImplementor):Implementor的具体实现。

二、桥接模式的应用场景

​ 1、在抽象和具体实现之间需要增加更多的灵活性的场景。

​ 2、一个类存在两个(或多个)独立变化的维度,而这两个(或多个)维度都需要独立进行扩展。

​ 3、不希望使用继承,或因为多层继承导致系统类的个数剧增。

三、桥接模式的代码示例

​ 消息类型:邮箱消息、短信消息。

​ 紧急程度:普通信息、紧急信息。

抽象角色——AbstractMessage:

public abstract class AbstractMessage {
    Message message;

    public AbstractMessage(Message message) {
        this.message = message;
    }

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

修正抽象——NomalMessage

public class NomalMessage extends AbstractMessage{
    public NomalMessage(Message message) {
        super(message);
    }

    @Override
    public void sendMessage(String message, String toUser) {
        super.sendMessage(message, toUser);
    }
}

修正抽象——UragencyMessage

public class UragencyMessage extends AbstractMessage {

    public UragencyMessage(Message message) {
        super(message);
    }

    @Override
    public void sendMessage(String message, String toUser) {
        message = "紧急" + message;
        super.sendMessage(message, toUser);
    }

}

实现角色——Message

public interface Message {

    void send(String message, String toUser);
}

具体实现——EmailMessage

public class EmailMessage implements Message {

    @Override
    public void send(String message, String toUser) {
        System.out.println(String.format("使用邮件短信息的方法,发送信息%s给%s", message, toUser));
    }

}

具体实现——SmsMessage

public class SmsMessage implements Message {
    
    @Override
    public void send(String message, String toUser) {
        System.out.println(String.format("使用短信服务的方法,发送信息%s给%s", message, toUser));
    }
    
}

四、桥接模式的优缺点

(一)、优点

1、分离抽象部分及其具体实现部分

2、提高了系统的扩展性

3、符合开闭原则

4、符合合成复用原则

(二)、缺点

1、增加了系统的理解与设计难度

2、需要正确地识别系统中两个独立变化的维度