一、桥接模式的概念和角色
(一)、桥接模式的概念
桥接模式也称为桥梁模式。是将抽象部分与它的具体实现部分分离,使他们都可以独立地变化,属于结构型模式。
桥接模式主要目的是通过组合的方式建立两个类之间的联系,而不是继承。但又类似于多重继承方案,但是多重继承方案往往违背类的单一职责原则,其复用性比较差,桥接模式是比多重继承更好的替代方案。桥接模式的核心在于解耦抽象和实现。
(二)、桥接模式的角色
抽象(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、需要正确地识别系统中两个独立变化的维度