桥接模式(Bridge Pattern)又称作桥梁模式
,指将抽象部分与具体实现部分分离,使它们都可以独立地变化,属于结构型设计模式。
桥接模式的主要目的是通过组合的方式建立两个类之间的联系,而不是继承,但又类似多重继承方案。
桥接 模式的核心在于把抽象与实现解耦。这里的抽象与实现指的是两种独立变化的维度。
(1)模式的结构
主要角色如下:
优点:
缺点:
代码如下:
public class BridgePattern {public static void main(String[] args) {ConcreteIImplementorA iImplementorA = new ConcreteIImplementorA();// 组合/聚合实现RefinedAbstraction abstraction = new RefinedAbstraction(iImplementorA);abstraction.operation();}
}// 抽象角色
abstract class Abstraction {// 实现角色的引用protected IImplementor iImplementor;public Abstraction(IImplementor iImplementor) {this.iImplementor = iImplementor;}public void operation(){iImplementor.operationImpl();}
}// 修正角色
class RefinedAbstraction extends Abstraction{public RefinedAbstraction(IImplementor iImplementor) {super(iImplementor);}@Overridepublic void operation() {super.operation();// do somethingSystem.out.println("RefinedAbstraction do something");}
}// 实现角色
interface IImplementor{void operationImpl();
}// 具体实现角色
class ConcreteIImplementorA implements IImplementor{@Overridepublic void operationImpl() {System.out.println("ConcreteIImplementorA----do");}
}class ConcreteIImplementorB implements IImplementor{@Overridepublic void operationImpl() {System.out.println("ConcreteIImplementorB----do");}
}
(1)消息-实现角色
public interface IMessage {void send(String message, String toUser);
}
(2)邮件消息-具体实现角色
public class EmailMessage implements IMessage {@Overridepublic void send(String message, String toUser) {System.out.println("使用邮件消息发送:" + message + " 给 " + toUser);}
}
(3)短信消息-具体实现角色
public class SMSMessage implements IMessage {@Overridepublic void send(String message, String toUser) {System.out.println("使用短信消息发送:" + message + " 给 " + toUser);}
}
(4)桥接抽象角色
public class AbstractMessage {protected IMessage iMessage;public AbstractMessage(IMessage iMessage) {this.iMessage = iMessage;}// 发送消息,委派给实现部分的方法public void sendMessage(String message, String toUser) {this.iMessage.send(message, toUser);}
}
(5)具体普通消息-修正角色
public class NomalMessage extends AbstractMessage {public NomalMessage(IMessage iMessage) {super(iMessage);}@Overridepublic void sendMessage(String message, String toUser) {// 普通消息,直接调用父类发送即可super.sendMessage(message, toUser);}
}
(6)具体加急消息-修正角色
public class UrgencyMessage extends AbstractMessage {public UrgencyMessage(IMessage iMessage) {super(iMessage);}@Overridepublic void sendMessage(String message, String toUser) {message = "【加急】" + message;super.sendMessage(message, toUser);// do something}
}
(7)测试
public static void main(String[] args) {IMessage emailMessage = new EmailMessage();AbstractMessage nomalMessage = new NomalMessage(emailMessage);nomalMessage.sendMessage("野王求让buff", "赵云");IMessage smsMessage = new SMSMessage();AbstractMessage urgencyMessage = new UrgencyMessage(emailMessage);urgencyMessage.sendMessage("野王请求支援", "赵云");}
– 求知若饥,虚心若愚。