桥接模式(Bridge)
时间:2022-04-26
本文章向大家介绍桥接模式(Bridge),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
桥接模式(Bridge)
桥接模式(Bridge)[Handle/Body]
意图:将抽象部分与它的实现部分分离,使他们都可以独立的变化。
应用:不同系统平台的Windows界面。
模式结构:
心得:
用户所见类体系结构(Window派生)提供了一系列用户的高层操作的接口,但是这些接口的实现是基于具体的底层实现的(WindowImp)。我们不应该为不同的实现提供单独的代码,而应该将这些实现上的区别封装起来。WindowImp提供了合适数量和粒度的底层抽象,而实现这些接口的工作由具体的子类来做。这些底层抽象接口通过组合耦合的方式被高层类体系调用,而这一切对用户是透明的。高层类Window及其子类只需要使用WindowImp提供好的接口来实现自己的功能就可以了,当需要进行实现平台的移植的时候只需要更换具体的实现类就可以了,而不会对用户的代码有任何影响。使用桥模式将用户的所见的抽象接口与接口的具体实现分离,而且抽象接口和实现部分是完全独立变化的。该类问题和抽象工厂有点类似,但是不能使用抽象工厂。因为抽象工厂需要产品拥有一致的接口和继承层次,而这些条件在不同的平台上肯定是无法满足的。
举例:
就上述列举的Window的实现问题,我们把实现的C++代码和用户操作代码列举如下:
//底层实现部分
class WindowImp
{
public:
virtual void devDrawText()=0;
virtual void devDrawLine()=0;
virtual ~WindowImp(){}
};
class XWindowImp:public WindowImp
{
public:
virtual void devDrawText()
{
cout<<"XWindow--Text"<<endl;
}
virtual void devDrawLine()
{
cout<<"XWindow--Line"<<endl;
}
};
class PMWindowImp:public WindowImp
{
public:
virtual void devDrawText()
{
cout<<"PMWindow--Text"<<endl;
}
virtual void devDrawLine()
{
cout<<"PMWindow--Line"<<endl;
}
};
//高层抽象部分
class Window
{
WindowImp*imp;//底层实现
public:
Window(WindowImp*i):imp(i){}
virtual void drawText()
{
imp->devDrawText();
}
virtual void drawRect()
{
imp->devDrawLine();
imp->devDrawLine();
imp->devDrawLine();
imp->devDrawLine();
}
virtual ~Window()
{
delete imp;
}
};
class IconWindow:public Window
{
public:
IconWindow(WindowImp*i):Window(i){}
virtual void drawBoard()
{
drawRect();
drawText();
}
};
class TrasientWindow:public Window
{
public:
TrasientWindow(WindowImp*i):Window(i){}
virtual void drawCloseBox()
{
drawRect();
}
};
WindowImp*imp=new XWindowImp();
Window w(imp);
w.drawText();
w.drawRect();
imp=new PMWindowImp();
IconWindow iw(imp);
iw.drawBoard();
至于imp的构造时机可以通过工厂方法根据不同的平台来构造,用户不需要知道系统构造了什么样的imp对象,至于工厂方法类又可以使用单例模式来实现,这样系统的差别全部被封装在一个单独的对象内。用户代码对Window的操作不受平台的任何约束。
参考文章:http://www.cnblogs.com/fengchao/archive/2005/08/03/206971.html
- 【go语言】Goroutines 并发模式(二)
- 从零开始搭建Nginx和Tomcat的web集群环境
- 【翻译】为什么 goroutine 的栈内存无穷大?
- 从PowerVM,KVM到Docker:存储池的配置与调优---第一篇终结(第3子篇)
- goroutine背后的系统知识
- 从PowerVM,KVM到Docker:存储池的配置与调优---第一篇(第2子篇)
- 2017最后一天的学习-TensorFlow
- 从PowerVM,KVM到Docker:存储池的配置与调优---第一篇(第1子篇)
- 36小时,造一个亚马逊无人商店 | 实战教程+代码
- 使用Echarts来实现数据可视化
- 手把手教你用TensorFlow实现看图说话 | 教程+代码
- 自动化平台开发的几点总结
- epoll入门
- 使用Go开发一个简单的服务器程序
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 访问令牌JWT
- Java集成JWT
- Computer Graphics note(3):视口变换&光栅化
- Mac安装mysql
- 剑指Offer题解
- nginx 常见问题记录
- ReturnSingleDatabase为True报错的解决办法
- 【Vim】vim配置的选择
- 关于HashMap的一些理解
- SpringBoot2.x系列教程(六十一)Spring Boot集成FastDFS实现文件上传
- 解决对接华为kafka 进行Kerberos认证时的sun.security.krb5.KrbException
- Newbe.Claptrap 框架如何实现多级生命周期控制?
- Kafka linux(centos7)安装配置kerberos并在另一台机器上使用Java服务接收消息
- SpringCloud bus 手动post可用 使用webhooks自动更新配置失效的解决小记
- 处理Storm1.2.2 日志报错 与spring boot冲突