python 设计模式之桥接模式 Bridge Pattern
#写在前面
前面写了那么设计模式了,有没有觉得有些模式之间很类似,甚至感觉作用重叠了,模式并不是完全隔离和独立的,有的模式内部其实用到了其他模式的技术,但是又有自己的创新点,如果一味地认为每个模式都是独一无二,与其他模式完全区别的,这是一种误区
#引入模式动机
这个例子清晰而直白的说明了为啥要用桥接模式,我就拿过来用了,链接在参考里
• 第二种设计方案是根据实际需要对形状和颜色进行组合。
对于有两个变化维度(即两个变化的原因)的系统,采用方案二来进行设计系统中类的个数更少,且系统扩展更为方便。设计方案二即是桥接模式的应用。桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量。
#模式定义
通俗点讲就是在不同的地方之间搭一座桥,让他们连接起来,可以相互通讯和使用。
在模式中,就是为被分离了的抽象部分和实现部分来搭桥。
桥接模式中的桥接是单向的,也就是只能是抽象部分的对象去使用实现部分的对象,而不能反过来,也就是个单向桥。
抽象化角色就像是一个水杯的手柄,而实现化角色和具体实现化角色就像是水杯的杯身。手柄控制杯身,这就是此模式别名“柄体”的来源。
#涉及角色
具体实现化(Concrete Implementor)角色:这个角色给出实现化角色接口的具体实现
这些是从百度百科抄的
#桥接模式分析
桥梁模式的用意是"将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化"。这句话有三个关键词,也就是抽象化、实现化和脱耦。
1)抽象化
2)实现化
3)脱耦
将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改换成为弱关联。因此,桥梁模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以相对独立地变化。这就是桥梁模式的用意。
这些是从百度百科抄的
#桥接模式的优点
#桥接模式的缺点
• 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
• 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。
#桥接模式的应用场景
1)Java语言通过Java虚拟机实现了平台的无关性
2)JDBC驱动器
桥梁模式在Java应用中一个非常典型的例子就是JDBC驱动器。JDBC为所有的关系型数据库提供一个通用的界面。一个应用系统动态的选择一个合适的驱动器,然后通过驱动器向数据库引擎发出指令。这个过程就是将抽象角色的行为委派给实现角色的过程。
抽象角色可以针对任何数据库引擎发出查询指令,因为抽象角色并不直接�与数据库引擎打交道,JDBC驱动器负责这个底层的工作。由于JDBC驱动器的存在,应用系统可以不依赖于数据库引擎的细节而独立的演化;同时数据库引擎也可以独立�于应用系统的细节而独立的演化。两个独立的等级结构图如下图所示,左边是JDBC API的等级结构,右边是JDBC驱动器的等级结构,应用程序是建立在JDBC API的基础之上的。
应用系统作为一个等级结构,与JDBC驱动器这个等级结构是相对独立的,它们之间没有静态的强关联。应用系统通过委派与JDBC驱动器相互作用,这是一个桥梁模式的例子。
JDBC这种架构,把抽象部分和具体实现部分分离开来,从而使得抽象部分和具体实现部分都可以独立的扩展。对于应用程序而言,之遥选用不同的驱动,就可以让程序操作不同的数据库,而无需更改应用程序,从而实现在不同的数据库上移植;对于驱动程序而言,为数据库实现不同的驱动程序,并不会影响应用程序。
#适合使用桥接模式的情景
#类结构
# 接口实现类
class Implementor:
def Operation(self):
raise NotImplementedError class ConcreteImplementorA(Implementor):
def Operation(self):
print("实现 A的方法") class ConcreteImplementorB(Implementor):
def Operation(self):
print("实现 B的方法")
# 抽象类
class Abstraction():
def __init__(self,implementor):
self.implementor = implementor
def Operation(self):
raise NotImplementedError class RefineAbstraction(Abstraction):
def Operation(self):
self.implementor.Operation() if __name__ == "__main__":
a = ConcreteImplementorA()
b = ConcreteImplementorB()
aa = RefineAbstraction(a)
ab = RefineAbstraction(b)
aa.Operation()
ab.Operation()
#抽象类:人
class people:
def set_skill(self,skill):
self.skill=skill
def perform_skill(self):
pass #具体抽象类:花匠
class hua_j(people):
def perform_skill(self):
print('我是花匠')
self.skill.perform_skill()
#具体抽象类:木匠
class mu_j(people):
def perform_skill(self):
print('我是木匠')
self.skill.perform_skill()
#具体抽象类:铁匠
class tie_j(people):
def perform_skill(self):
print('我是铁匠')
self.skill.perform_skill() #功能类,也是实现类
class skill:
def perform_skill(self):
pass #具体功能类,也是具体实现类 种花
class skill_hua(skill):
def perform_skill(self):
print('我会种花') #具体功能类,也是具体实现类 做木桌子
class skill_mu:
def perform_skill(self):
print('我会做木桌子') #具体功能类,也是具体实现类 做铁桌子
class skill_tie:
def perform_skill(self):
print('我会做铁桌子') #具体功能类,也是具体实现类 做老师
class skill_teacher:
def perform_skill(self):
print('我会做老师,可以教学生')
#具体功能类,也是具体实现类 做家具
class skill_jj:
def perform_skill(self):
print('我会做家具') def main():
h=hua_j() #花匠
m=mu_j() #木匠
t=tie_j() #铁匠 sh=skill_hua()# 本事:会种花
sm=skill_mu() #本事:会做木头桌子
st=skill_tie() #本事:会做铁桌子
s_t=skill_teacher() #本事:会教学生
s_jj=skill_jj() #本事:会做家具 h.set_skill(sh) #给花匠set种花的本事
h.perform_skill() #花匠 种花
h.set_skill(s_t) #给花匠set做老师的本事
h.perform_skill() #花匠教学生 print('=============')
m.set_skill(sm) #给木匠set 做木桌子的本事
m.perform_skill() #木匠 做木桌子
m.set_skill(s_t) #给木匠set做老师的本事
m.perform_skill() #木匠教学生
m.set_skill(s_jj) #给木匠set做家具的本事
m.perform_skill() #木匠做家具 print('=============')
t.set_skill(st) #给木匠set 做木桌子的本事
t.perform_skill() #木匠 做木桌子
t.set_skill(s_t) #给木匠set做老师的本事
t.perform_skill() #木匠教学生
t.set_skill(s_jj) #给木匠set做家具的本事
t.perform_skill() #木匠做家具 if __name__ == '__main__':
main()
参考
https://www.cnblogs.com/WindSun/p/10260547.html
https://baike.baidu.com/item/%E6%A1%A5%E6%8E%A5%E6%A8%A1%E5%BC%8F/5293399?fr=aladdin
https://www.cnblogs.com/zyrblog/p/9233189.html
https://blog.csdn.net/sunyqcn/article/details/85113751
https://www.jianshu.com/p/775cb53a4da2
https://www.cnblogs.com/qq_841161825/articles/10142201.html
https://blog.csdn.net/weixin_41431904/article/details/80783839
python 设计模式之桥接模式 Bridge Pattern的更多相关文章
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...
- 【设计模式】桥接模式 Bridge Pattern
开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号, ...
- 二十四种设计模式:桥接模式(Bridge Pattern)
桥接模式(Bridge Pattern) 介绍将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,现在使这些操作的抽象 ...
- 桥接模式(Bridge Pattern)
1,定义 桥接模式(Bridge Pattern),也称为桥梁模式,其用意是将抽象化与实现化脱耦,使得两者可以独立的变化,它可以使软件系统沿着多个方向进行变化,而又不引入额外的复杂 ...
- Net设计模式实例之桥接模式( Bridge Pattern)
一.桥接模式简介(Brief Introduction) 桥接模式(Bridge Pattern),将抽象部分与它的实现部分分离,使的抽象和实现都可以独立地变化. Decouple an abstra ...
- 转:设计模式-----桥接模式(Bridge Pattern)
转自:http://www.cnblogs.com/houleixx/archive/2008/02/23/1078877.html 记得看原始链接的评论. 学习设计模式也有一段时间了,今天就把我整理 ...
- C#设计模式——桥接模式(Bridge Pattern)
一.概述在软件开发中,我们有时候会遇上一个对象具有多个变化维度.比如对汽车对象来说,可能存在不同的汽车类型,如公共汽车.轿车等,也可能存在不同的发动机,如汽油发动机.柴油发动机等.对这类对象,可应用桥 ...
- [设计模式] 7 桥接模式 bridge
#include<iostream> using namespace std; class AbstractionImp { public: virtual ~AbstractionImp ...
- python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)
十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...
随机推荐
- K3 Cloud的数据中心加载异常处理
以前一直是财务维护的K3 Cloud突然说不能登录,用的SQL 2008的数据库,运维也搞不定,找帮忙,因为是部署在阿里云上,上去看看数据库,这个K3数据库占了600多G,想看看这个表结构,就是打不 ...
- 高并发下redis
1.================================================================================================== ...
- Linux/Windows下安装SonarCube
1. 下载合适的版本,尽量不要下载最新的版本,最新的版本要求Java 11+,如果没有安装最新版的Java的话,尽量用 SonarQube 7.0 以下的版本,SonarQube 7.0是可以用jdk ...
- 【Python】使用Python压缩文件/文件夹
[Python压缩文件夹]导入“zipfile”模块 def zip_ya(startdir,file_news): startdir = ".\\123" #要压缩的文件夹路径 ...
- 用python爬取全网妹子图片【附源码笔记】
这是晚上没事无聊写的python爬虫小程序,专门爬取妹子图的,养眼用的,嘻嘻!身为程序狗只会这个了! 废话不多说,代码附上,仅供参考学习! """ 功能:爬取妹子图全网妹 ...
- 关于equals和hashcode问题
默认情况下也就是从超类Object继承而来的equals方法与‘==’是完全等价的,比较的都是对象的内存地址,但我们可以重写equals方法,使其按照我们的需求的方式进行比较,如String类重写了e ...
- vue路由机制导致的坑,坑,坑
实现一个手机定位的功能: 跳转到指定页面的时候,安卓手机地图定位正常,苹果手机第一次进入页面,地图定位不准, 要刷新后,才可以准确定位,后来无意间不用路由跳转,使用JS跳转,完美解决, 特此记录,方便 ...
- 项目兼容ie8技术要点
好久没有写博客了,因为最近公司项目要调ie8兼容,一直在忙这事,终于竣工了,跟大家分享下这老掉牙的浏览器是如何搞定的...本人新手一枚,欢迎大家指教 项目是使用的jeecg框架,后台使用的java,前 ...
- codecs 1264 芳香数
1264 芳香数 题目描述 Description This question involves calculating the value of aromatic numbers which are ...
- 16、job触发流程原理剖析与源码分析
一.以Wordcount为例来分析 1.Wordcount val lines = sc.textFile() val words = lines.flatMap(line => line.sp ...