桥接模式(Bridge Pattern)
桥接模式也称为桥梁模式,接口(Integer)模式或者柄体(Handle and Body)模式,是将抽象部分和它的具体实现部分分离,是它们都可以独立地变化;
通过组合的方式建立两个类之间的联系,而不是继承; 桥接模式属于结构型模式;  
继承一般来作为多继承的备用方案;  
桥接模式的结构
 
  
桥接模式主要包括一下几个角色:  
1、抽象角色(Abstraction): 定义抽象类,并包含一个对实现化对象的引用,正是这个引用,起着桥梁性的作用;
2、扩展抽象化(Refined Abstraction)角色:
Abstraction
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | public abstract class Abstraction {
 protected IImplementor iImplementor;
 
 public Abstraction(IImplementor iImplementor) {
 this.iImplementor = iImplementor;
 }
 
 public void operation(){
 this.iImplementor.operation();
 }
 }
 
 | 
IImplementor
| 12
 3
 
 | public interface IImplementor {void operation();
 }
 
 | 
ConcreteImplementA
| 12
 3
 4
 5
 6
 7
 
 | public class ConcreteImplementA implements IImplementor{
 @Override
 public void operation() {
 
 }
 }
 
 | 
ConcreteImplementB
| 12
 3
 4
 5
 6
 7
 
 | public class ConcreteImplementB implements IImplementor{@Override
 public void operation() {
 
 }
 }
 
 
 | 
RefinedAbstraction
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | public class RefinedAbstraction extends Abstraction{
 public RefinedAbstraction(IImplementor iImplementor) {
 super(iImplementor);
 }
 
 @Override
 public void operation() {
 super.operation();
 }
 }
 
 | 
举个例子
 
  
AbstractMessage
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | public abstract class AbstractMessage {
 private IMessage message;
 
 public AbstractMessage(IMessage message) {
 this.message = message;
 }
 
 void sendMsg(String msg,String toUser){
 this.message.send(msg,toUser);
 }
 }
 
 | 
IMessage
| 12
 3
 
 | public interface IMessage {void send(String msg,String toUser);
 }
 
 | 
SmsMessage
| 12
 3
 4
 5
 6
 
 | public class SmsMessage implements IMessage{@Override
 public void send(String msg, String toUser) {
 System.err.println("使用短信消息发送 " + msg + " 发送给 " + toUser);
 }
 }
 
 | 
EmailMessage
| 12
 3
 4
 5
 6
 
 | public class EmailMessage implements IMessage{@Override
 public void send(String msg, String toUser) {
 System.err.println("使用邮件消息发送 " + msg + " 发送给 " + toUser);
 }
 }
 
 | 
NormalMessage
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | public class NormalMessage extends AbstractMessage{
 public NormalMessage(IMessage message) {
 super(message);
 }
 
 @Override
 void sendMsg(String msg, String toUser) {
 super.sendMsg(msg, toUser);
 }
 }
 
 | 
UegencyMessage
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | public class UegencyMessage extends AbstractMessage{void sendMsg(String msg,String toUser){
 msg = "[ 加急]" + msg;
 super.sendMsg(msg,toUser);
 }
 
 public UegencyMessage(IMessage message) {
 super(message);
 }
 }
 
 | 
DemoTest
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | public class DemoTest {public static void main(String[] args) {
 IMessage message = new SmsMessage();
 AbstractMessage abstractMessage = new NormalMessage(message);
 abstractMessage.sendMsg("加班申请","老大");
 
 message = new EmailMessage();
 abstractMessage = new UegencyMessage(message);
 abstractMessage.sendMsg("调休申请","老总");
 
 }
 }
 
 | 
| 12
 
 | 使用短信消息发送 加班申请 发送给 老大使用邮件消息发送 [ 加急]调休申请 发送给 老总
 
 | 
桥接模式的适用场景
1、在抽象和具体实现之间需要增加更多的灵活性的场景;
2、一个类在两个或者多个独立变化的维度,而这两个或多个维度都需要独立的进行拓展
3、不希望使用继承,或者因为多层继承导致系统类的个数剧增;  
 
  
桥接模式的优点
1、遵循软件设计原则,分离抽象部分和具体实现部分
2、提高了系统的扩展性
3、符合开闭原则
4、符合合成复用原则  不使用继承而使用组合  
桥接模式
1、增加了系统代码可读性和复杂性
2、需要正确识别交接的不同维度