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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 经典排序算法(1)——冒泡排序算法详解

    经典排序算法(1)——冒泡排序算法详解冒泡排序(BubbleSort)是一种典型的交换排序算法,通过交换数据元素的位置进行排序。一、算法基本思想(1)基本思想冒泡排序的基本思想就是:从无序序列头部开始,进行两两比较,根据大小交换位置,直到最后将最大(小)的数据元素交换到了无序队列的队尾,从而成为有序序列的一部分;下一次继续这个过程,直到所有数据元素都排好序。算法的核心在于每次通过两两比较交换位置,选出

    2022年7月8日
    22
  • hikaripool信息_HikariPool源码(四)资源状态[通俗易懂]

    hikaripool信息_HikariPool源码(四)资源状态[通俗易懂]Java极客|作者/铿然一叶这是Java极客的第55篇原创文章1.本章目的了解池资源的状态,以及状态如何变迁,用于池化资源设计参考。2.HikariPool资源核心类回顾HikariPool资源相关的类如下:类说明:类职责HikariPool资源池,客户端资源操作的入口。ConcurrentBag通用的并发包工具。CopyOnWriteArrayList一个列表,用于存储资源,…

    2022年6月23日
    23
  • 基于Spring Cloud项目实战

    (2018年10月2日,从git上移到这里)通过案例学习了基于Springcloud进行web微服务项目的开发,干货很多。Springcloud体系提供了完整的微服务开发的解决方案,整合了多个优秀组件,能够很好的帮助我们提高开发效率。在此做以下总结。SpringCloud简介SpringCloud是一个基于SpringBoot实现的微服务架构开发工具。它…

    2022年4月6日
    68
  • linux服务器部署kvm

    linux服务器部署kvm

    2021年6月3日
    113
  • laravel实现批量添加数据

    laravel实现批量添加数据

    2021年11月8日
    47
  • linux查看并杀死进程_ubuntu查看进程命令

    linux查看并杀死进程_ubuntu查看进程命令今天在netbeans中关闭webrick时,发现没有关闭掉,打入localhost:3000依然显示页面,发现无法从nb中再次关闭只有进入ubuntu的进程下关闭查看进程:1,ps-e命令2,feng@feng:~$sudonetstat-antupActiveInternetconnections(serversandestablished)ProtoRecv-QSe…

    2022年9月21日
    2

发表回复

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

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