• java设计模式(九)——桥接模式


    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、优缺点

    优点:

    提高了系统的扩展性,也符合开闭原则。

  • 相关阅读:
    荷兰国旗问题
    读取文件中数据到数组
    从五个球中选出3个枚举的简单运用
    搜索算法总结
    匿名对象
    欧几里得距离C++代码实现
    用递归法吧字符串S倒序
    利用系统来完成十进制,十六进制,八进制的转换
    DBHelper 使用的是存储过程
    DBHelper的一个小例子
  • 原文地址:https://www.cnblogs.com/tdyang/p/13272719.html
Copyright © 2020-2023  润新知