1、基本概念
适配器模式( Adapter Pattern )又叫做变压器模式,它的功能是将一个类的接口变成客户端所期望
的另一种接口,从而使原本因接口不匹配而导致无法在一起工作的两个类能够-起工作 ,属于结构型设
计模式。
桥接模式的目的主要是通过组合而不是继承建立两个类之间的关系。
2、类图和角色
基本角色:
接口:IImplementor,实现维度的基本操作,
具体实现:ConcreteImplementor,实现维度的具体操作
抽象/桥:Abstraction,持有IImplementor接口,一般是抽象类
修正抽象:继承自Abstraction,对Abstraction的方法进行完善。
使用场景:
1、在抽象和具体实现之间需要增加更多的灵活性的场景。
2、 一个类存在多个独立变化的维度,而这多个维度都需要独立进行扩展。
生活实例:桥梁,物理机与虚拟机的网络桥接连接
3、案例
生活中,我们会受到来qq,微信,钉钉等途径的消息,我们将这些信息进行分类:同学发来的信息,同事发来的信息,客户发来的信息
这两个维度,我们使用桥来建立联系:
类图:
接口:Imessage
public interface Imessage { void send(String msg,String to); }
其实现类:QqMessage
public class QqMessage implements Imessage { @Override public void send(String msg, String to) { System.out.printf("qq消息》》%s,%s ",msg,to); } }
其实现类:WechatMessage
public class WechatMessage implements Imessage { @Override public void send(String msg, String to) { System.out.printf("微信消息》》%s,%s ",msg,to); } }
其实现类:DingdingMessage
public class DingdingMessage implements Imessage { @Override public void send(String msg, String to) { System.out.printf("钉钉消息》》%s,%s ",msg,to); } }
抽象/桥:AbstractMessageBridge ,持有接口对象的具体实现
public class AbstractMessageBridge implements Imessage{ public Imessage imessage; public AbstractMessageBridge(Imessage imessage){ this.imessage = imessage; } @Override public void send(String msg, String to) { imessage.send(msg,to); } }
修正抽象:ClassmateMessage
public class ClassmateMessage extends AbstractMessageBridge{ public ClassmateMessage(Imessage imessage) { super(imessage); } @Override public void send(String msg, String to) { msg = "同学信息:" + msg ; super.send(msg,to); record(); } public void record(){ String content = "同学肯定没问题"; } }
修正抽象:ColleagueMessage
public class ColleagueMessage extends AbstractMessageBridge { public ColleagueMessage(Imessage imessage) { super(imessage); } @Override public void send(String msg, String to) { msg = "同事信息:" + msg ; super.send(msg,to); record(); } public void record(){ String content = "我想想"; } }
修正抽象:CustomerMessage
public class CustomerMessage extends AbstractMessageBridge{ public CustomerMessage(Imessage imessage) { super(imessage); } @Override public void send(String msg, String to) { msg = "客户信息:" + msg ; super.send(msg,to); record(); } public void record(){ String content = "woc"; } }
测试:
public class Test { public static void main(String[] args) { QqMessage qqMessage = new QqMessage(); WechatMessage wechatMessage = new WechatMessage(); DingdingMessage dingdingMessage = new DingdingMessage(); AbstractMessageBridge abstractMessageBridge = new ClassmateMessage(qqMessage); AbstractMessageBridge abstractMessageBridge2 = new ClassmateMessage(wechatMessage); AbstractMessageBridge abstractMessageBridge3 = new ClassmateMessage(dingdingMessage); abstractMessageBridge.send("借我钱","小王"); abstractMessageBridge2.send("借我钱","小王"); abstractMessageBridge3.send("借我钱","小王"); } }
输出:
qq消息》》同学信息:借我钱,小王
微信消息》》同学信息:借我钱,小王
钉钉消息》》同学信息:借我钱,小王
如果我们需要再建立一个信息途径,比如抖音信息,我们只需要写一个扩展即可。
public class DouyinMessage implements Imessage { @Override public void send(String msg, String to) { System.out.printf("抖音消息》》%s,%s ",msg,to); } }
4、优缺点
优点:
提高了系统的扩展性,也符合开闭原则。