bridge桥接模式_Bridge模式

bridge桥接模式_Bridge模式bridge模式动机案例要点总结笔记动机由于某些类型的固有的实现逻辑,使得他们具有两个变化维度,乃至多个维度的变换如何应对这种”多维度的变化“?如何利用面向对象技术来是使得类型可以轻松地沿着两个乃至多个方向变换而不引入额外地复杂度?案例PC端和Mobile端平台和业务分离朴素class Messager{ public: virtual void Login(string username,string password) = 0; virtual void SendM

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

动机

由于某些类型的固有的实现逻辑,使得他们具有两个变化维度,乃至多个维度的变换

如何应对这种”多维度的变化“?如何利用面向对象技术来是使得类型可以轻松地沿着两个乃至多个方向变换而不引入额外地复杂度?

模式定义

将抽象不分(业务功能)与实现部分(平台实现)分离,是他们都可以独立变化。

案例

PC端和Mobile端平台和业务分离
朴素

class Messager{ 
   
    public:
    virtual void Login(string username,string password) = 0;
    virtual void SendMessage(string message) = 0;
    virtual void SendMessage(Image image) = 0;

    virtual void PlaySound() = 0;
    virtual void PlayShape() = 0;
    virtual void WriteText() = 0;
    virtual void Connect() = 0;

    virtual ~Messager(){ 
   }
}

//平台实现
class PCMessagerBase : public Messager{ 
   
public:
    virtual void PlaySound(){ 
   
        //...
    }
    virtual void DrawSHape(){ 
   
        //,,
    }
    virtual void WriteText(){ 
   
        //..
    }
    virtual void connect(){ 
   
        //,,
    }
}

class MobileMessagerBase : public Messager{ 
   
public:
    virtual void PlaySound(){ 
   
        //...
    }
    virtual void DrawSHape(){ 
   
        //,,
    }
    virtual void WriteText(){ 
   
        //..
    }
    virtual void connect(){ 
   
        //,,
    }
}

//业务抽象
//精简版
class PCMessageLite : public PCMessagerBase{ 
   
public :
    virtual void Login(string username,string password){ 
   
        PCMessagerBase::Connect();
        //..
    }
    virtual void SendMessage(string message){ 
   
        PCMessagerBase::WriteText();
        //..
    }
    virtual void SendPicture(Image image){ 
   
        PCMessagerBase::DrawShape();
        //..
    }
}
//完美版
class PCMessagePerfect : public PCMessagerBase{ 
   
public :
    virtual void Login(string username,string password){ 
   
        PCMessagerBase::PlaySound();
        //....
        PCMessagerBase::Connect();
        //...
    }
    virtual void SendMessage(string message){ 
   
        PCMessagerBase::PlaySound();
        //...
        PCMessagerBase::WriteText();
        //...
    }
    virtual void SendPicture(Image image){ 
   
        PCMessagerBase::PlaySound();
        //...
        PCMessagerBase::DrawShape();
        //...
    }
}
//精简版
class MobileMessageLite : public MobileMessagerBase{ 
   
public :
    virtual void Login(string username,string password){ 
   
        MobileMessagerBase::Connect();
        //..
    }
    virtual void SendMessage(string message){ 
   
        MobileMessagerBase::WriteText();
        //..
    }
    virtual void SendPicture(Image image){ 
   
        MobileMessagerBase::DrawShape();
        //..
    }
}
//完美版
class MobileMessagerPerfect : public MobileMessagerBase{ 
   
public :
    virtual void Login(string username,string password){ 
   
        MobileMessagerPerfect::PlaySound();
        //....
        MobileMessagerPerfect::Connect();
        //...
    }
    virtual void SendMessage(string message){ 
   
        MobileMessagerPerfect::PlaySound();
        //...
        MobileMessagerPerfect::WriteText();
        //...
    }
    virtual void SendPicture(Image image){ 
   
        MobileMessagerPerfect::PlaySound();
        //...
        MobileMessagerPerfect::DrawShape();
        //...
    }
}

Bridge桥模式

class Messager{ 
   
    private:
    MessagerImp * messager;
    public:
    Messager():messager(messager){ 
   

    }
    virtual void Login(string username,string password) = 0;
    virtual void SendMessage(string message) = 0;
    virtual void SendMessage(Image image) = 0;


    virtual ~Messager(){ 
   }
}

class MessagerImp{ 
   
    public:
    virtual void PlaySound() = 0;
    virtual void PlayShape() = 0;
    virtual void WriteText() = 0;
    virtual void Connect() = 0;
    virtual ~MessagerImp(){ 
   }
}

//平台实现
class PCMessagerImp : public MessagerImp{ 
   
public:
    virtual void PlaySound(){ 
   
        //...
    }
    virtual void DrawSHape(){ 
   
        //,,
    }
    virtual void WriteText(){ 
   
        //..
    }
    virtual void connect(){ 
   
        //,,
    }
}

class MobileMessagerImp : public MessagerImp{ 
   
public:
    virtual void PlaySound(){ 
   
        //...
    }
    virtual void DrawSHape(){ 
   
        //,,
    }
    virtual void WriteText(){ 
   
        //..
    }
    virtual void connect(){ 
   
        //,,
    }
}

//业务抽象
//精简版
class PCMessageLite : public Messager{ 
   
public :
    virtual void Login(string username,string password){ 
   
        messageImp->Connect();
        //..
    }
    virtual void SendMessage(string message){ 
   
        messageImp->WriteText();
        //..
    }
    virtual void SendPicture(Image image){ 
   
        messageImp->DrawShape();
        //..
    }
}
//完美版
class PCMessagePerfect : public Messager{ 
   
public :
    virtual void Login(string username,string password){ 
   
        messageImp->PlaySound();
        //....
        messageImp->Connect();
        //...
    }
    virtual void SendMessage(string message){ 
   
        messageImp->PlaySound();
        //...
        messageImp->WriteText();
        //...
    }
    virtual void SendPicture(Image image){ 
   
        messageImp->PlaySound();
        //...
        messageImp->DrawShape();
        //...
    }
}
//精简版
class MobileMessageLite : public Messager{ 
   
public :
    virtual void Login(string username,string password){ 
   
        messageImp->Connect();
        //..
    }
    virtual void SendMessage(string message){ 
   
        messageImp->WriteText();
        //..
    }
    virtual void SendPicture(Image image){ 
   
        messageImp->DrawShape();
        //..
    }
}
//完美版
class MobileMessagerPerfect : public Messager{ 
   
public :
    virtual void Login(string username,string password){ 
   
        messageImp->PlaySound();
        //....
        messageImp->Connect();
        //...
    }
    virtual void SendMessage(string message){ 
   
        messageImp->PlaySound();
        //...
        messageImp->WriteText();
        //...
    }
    virtual void SendPicture(Image image){ 
   
        messageImp->PlaySound();
        //...
        messageImp->DrawShape();
        //...
    }
}

void Process(){ 
   
    //运行时装配
    MessagerImp *mImp = new PCMessagerImp();
    Messager *m = new MobileMessagerPerfect(mImp);
}

要点总结

  • Bridge模式使用”对象间地组合关系“解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自地维度来变换。所谓抽象和实现可以沿着各自维度地变化,即”子类化“他们
  • Bridge模式有时候类似于多继承方案。但是多继承方案往往违背单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。
  • Bridge模式的应用一般是”多个非常强的变换维度“,有时一个类也有多于两个变化的维度。这时可以使用Bridge的扩展模式

笔记

  • 一个类中最好只有一个功能方向,如果有多个 ,就拆分成不同地类
  • 多个维度:比如说 业务功能和平台实现
  • 将某一个变换维度合在一起 打包成一个基类 用一个抽象指针指向它。如果有3个维度则把3个不分摘出来 用3个抽象指针指向它们
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169043.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Runnable接口详细详解「建议收藏」

    Runnable接口详细详解「建议收藏」创建线程对象,默认有一个线程名,以Thread-开头,从0开始计数构造函数Thread()Thread-0Thread-1Thread-2其他构造方法Thread(Runnabletarget)如果在构造thread的时候没有传递Runnable或者没有复写Thread的run方法,该thread将不会调用任何的东西,如果传递了Runnable接口的实例,后者复写了Thread的run方法,则会执行该方法的逻辑单元(逻辑代码)publicclassCreateThread2..

    2025年6月9日
    4
  • matlab as(assert dominance)

    目录一.语法1.输入参数二.说明三.示例1.值在预期范围之内2.期望的数据类型3.预期的代码执行情况assert是条件为false时引发错误。一.语法assert(cond)assert(cond,msg)assert(cond,msg,A1,…,An)assert(cond,errID,msg)assert(cond,errID,msg,A1,…,An)1.输入参数cond-断言条件MATLAB表达式..

    2022年4月15日
    43
  • Java数组(Array)

    Java数组(Array)数组(Array),是多个相同类型数据一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。数组相关的概念:数组名元素角标、下标、索引数组的长度:元素的个数数组的特点:数组是按序排列的数组属于引用数据类型的变量。数组的元素,既可以是基本数据类型,也可以是引用数据类型创建数组对象会在内存中开辟一整块连续的空间数组的长度一旦确定,就不能修改。数组…

    2022年7月8日
    25
  • spark scheduler_scheduledthreadpool

    spark scheduler_scheduledthreadpoolSpark的TaskScheduler和DagScheduler开始研究神奇的spark。会陆续将研究的心得放上来。在Spark中一个核心的是模块就是调度器(Scheduler),在spark中Scheduler有两种TaskScheduler(是低级的调度器接口),DagScheduler(是高级的调度)我们在创建SparkContext对象的时候,sparkcontext内部就会创建Ta…

    2022年10月10日
    7
  • 最长公共子串 动态规划_最长公共子上升序列

    最长公共子串 动态规划_最长公共子上升序列原题链接题目描述给定两个字符串str1和str2,输出连个字符串的最长公共子序列。如过最长公共子序列为空,则输出-1。输入描述:输出包括两行,第一行代表字符串str1,第二行代表str2。( 1<= length(str1),length(str2)<= 5000)输出描述:输出一行,代表他们最长公共子序列。如果公共子序列的长度为空,则输出-1。示例1输入1A2C3D4B56B1D23CA45B6A输出123456说明”123456″和“12C4B6”都是最长公共

    2022年8月8日
    3
  • 【spring】spring的jdbcTemplate操作[通俗易懂]

    【spring】spring的jdbcTemplate操作[通俗易懂]【spring】spring的jdbcTemplate操作

    2022年4月25日
    25

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号