桥接模式
桥接模式(bridge)也成为桥梁模式,接口(Interface)模式,柄体(Handle And Body)模式,是将抽象部分与它的具体实现部分分离,使得它们可以独立的变化,属于结构型模式。
桥接模式主要是通过组合的方式建立两个类之间的关系,而不是继承。但又类似于多重继承方案,但是多重继承方案往往违背了的单一职责原则,其复用性比较差,桥接模式是比多重继承方案更好的替代方案。
桥接模式的核心在于解耦抽象和实现。
桥接模式主要包含四种角色
- ①抽象Abstraction:该类持有一个对实现角色的引用,抽象角色的方法需要实现角色来实现。抽象角色一般为抽象类(构造函数规定子类要传入一个实现对象)
- ②修正抽象RefinedAbstraction:Abstraction的具体实现,对Abstraction的方法进行完善和扩展。
- ③实现Implementor:确定实现维度的基本操作,提供给Abstraction使用,该类一般为接口或实现类。
- ④具体实现ConcreteImplementor:Implementor的具体实现。
应用场景
- 在抽象和具体之间需要增加更多的灵活性的场景
- 一个类中存在两个或多个独立变化的维度,而这些维度可能需要扩展
不希望使用继承或因为多继承导致系统类的个数剧增
举例:
平时工作中 我们发消息 可以通过手机发送,邮件发送,以及内部系统发送。消息级别可以是普通,加急,特急消息。
package com.jdwa.bridge;
public interface IMessage {
void send(String message,String toUser);
}
package com.jdwa.bridge;
public class PhoneMessage implements IMessage {
@Override
public void send(String message, String toUser) {
System.out.println(String.format("使用手机的方式发送消息 %s 给 %s",message,toUser));
}
}
package com.jdwa.bridge;
public class EmailMessage implements IMessage {
@Override
public void send(String message, String toUser) {
System.out.println(String.format("使用邮件的方式发送消息 %s 给 %s",message,toUser));
}
}
package com.jdwa.bridge;
public class SystemMessage implements IMessage {
@Override
public void send(String message, String toUser) {
System.out.println(String.format("使用内部系统的方式发送消息 %s 给 %s",message,toUser));
}
}
package com.jdwa.bridge;
public abstract class AbstractMessage {
private IMessage message;
public AbstractMessage (IMessage message){
this.message = message;
}
public void senMessage(String message,String toUser){
this.message.send(message, toUser);
}
}
package com.jdwa.bridge;
public class NomalMessage extends AbstractMessage{
private IMessage message;
public NomalMessage(IMessage message){
super(message);
}
@Override
public void senMessage(String message,String toUser){
message = "【普通】"+message;
super.senMessage(message, toUser);
}
}
package com.jdwa.bridge;
public class UrgencyMessage extends AbstractMessage{
public UrgencyMessage(IMessage message) {
super(message);
}
@Override
public void senMessage(String message,String toUser){
message = "【加急】"+message;
super.senMessage(message, toUser);
}
}
package com.jdwa.bridge;
public class ExtraUrgency extends AbstractMessage {
public ExtraUrgency(IMessage message) {
super(message);
}
@Override
public void senMessage(String message,String toUser){
message = "【加急】"+message;
super.senMessage(message, toUser);
}
}
package com.jdwa.bridge;
public class Client {
public static void main(String[] args) {
IMessage message = new EmailMessage();
AbstractMessage abstractMessage = new NomalMessage(message);
abstractMessage.senMessage("加班申请","王总");
IMessage message1 = new SystemMessage();
AbstractMessage abstractMessage1 = new UrgencyMessage(message1);
abstractMessage1.senMessage("请假","张总");
IMessage message2 = new PhoneMessage();
AbstractMessage abstractMessage2 = new ExtraUrgency(message2);
abstractMessage2.senMessage("调休","陈总");
}
}
使用邮件的方式发送消息 【普通】加班申请 给 王总
使用内部系统的方式发送消息 【加急】请假 给 张总
使用手机的方式发送消息 【加急】调休 给 陈总