【python设计模式4】结构型模式1

目录

适配器模式

桥模式


适配器模式

 将一个类的接口转换成客户希望的另外一个接口,适配器使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。实现适配器的两种方式,类适配器使用多继承,对象适配器使用组合组合就是一个类中放入另一类的对象。 先来看下组合:

class A:passclass B:def __init__():self.a = A()

类适配器模式使用示例:

# 类适配器模式使用示例:
from abc import ABCMeta, abstractmethod# 目标接口
class Payment(object, metaclass=ABCMeta):@abstractmethoddef pay(self, money):passclass Alipay(Payment):def pay(self, money):print('支付了%d' % money)# 待适配的类
class BankPay():def cost(self, money):print('银联支付了%d' % money)# 类适配器
class PaymentAdapter(Payment, BankPay):"""把不兼容cost转换成pay"""def pay(self, money):self.cost(money)p = PaymentAdapter()
p.pay(100)
"""
银联支付了100
"""

对象适配器模式使用示例:

# 类适配器模式使用示例:
from abc import ABCMeta, abstractmethod# 目标接口
class Payment(object, metaclass=ABCMeta):@abstractmethoddef pay(self, money):passclass Alipay(Payment):def pay(self, money):print('支付了%d' % money)# 待适配的类
class BankPay():def cost(self, money):print('银联支付了%d' % money)# 待适配的类
class ApplePay():def cost(self, money):print('苹果支付了%d' % money)# 对象适配器
class PaymentAdapter(Payment):def __init__(self, payment):self.payment = paymentdef pay(self, money):self.payment.cost(money)p = PaymentAdapter(ApplePay())
p.pay(100)
p = PaymentAdapter(BankPay())
p.pay(100)
"""
苹果支付了100
银联支付了100
"""

适配器模式有三种角色,分别是目标接口、待适配的类和适配器。适用场景是:想使用一个已存在的类,而它的接口不符合你的要求。想使用一些已经存在的类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。

桥模式

桥模式是将一个事物的两个维度分离,使其都可以独立地变化。当事物有两个维度的表现,两个维度都可能扩展时使用。优点是:抽象和实现相分离,扩展能力强。如果不使用桥模式,在任何维度进行扩展,需要改好多代码,因为使用到了继承:

class Shape:passclass Rectangle(Shape):passclass Circle(Shape):passclass RedRectangle(Rectangle):passclass GreenRectangle(Rectangle):passclass RedCircle(Circle):passclass GreenCircle(Circle):pass

以上代码形状和颜色两个维度是通过类的继承关系紧密结合在一起,是紧耦合。紧耦合是是不可取的,应用桥模式的思想,可以使用组合来实现(松耦合)。如果需要画直线,直接加上直线的类。需要新颜色,直接加上颜色的类。两个维度都可以自由扩展,不需要添加很多代码。这里的角色有抽象、细化抽象、实现者和具体实现者:

from abc import ABCMeta, abstractmethod# 抽象
class Shape(metaclass=ABCMeta):def __init__(self, color):self.color = color@abstractmethoddef draw(self):pass# 实现
class Color(metaclass=ABCMeta):@abstractmethoddef paint(self, shape):pass# 细化抽象
class Rectangle(Shape):name = '长方形'def draw(self):self.color.paint(self)# 如果要扩展形状,只需要添加形状类
class Circle(Shape):name = '圆形'def draw(self):self.color.paint(self)# 细化实现
class Red(Color):def paint(self, shape):print('画红色的%s' % shape.name)# 如果要扩展颜色,只需要添加颜色类
class Green(Color):def paint(self, shape):print('画绿色的%s' % shape.name)rectangle = Rectangle(Red())
rectangle.draw()
circle = Circle(Green())
circle.draw()
"""
画红色的长方形
画绿色的圆形
"""

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1540725.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Django-cookie和session

文章目录 前言CookieSession 一、Django 中 Cookie二、Django 中 Session三.区别 前言 Cookie Cookie 是由服务器发送到用户浏览器的小文件,用于存储用户的相关信息。每次用户访问网站时,浏览器会将这些 cookie 发送回服务器 特点: 1. 数据存储在客户…

网络质量劣化分析:保障业务连续性与网络优化的核心步骤

目录 什么是网络质量劣化? 常见的网络质量劣化表现 网络质量劣化的常见原因 1. 网络设备性能不足或老化 2. 网络配置问题 3. 链路拥塞 4. 外部攻击或恶意流量 案例分析:一次企业内部网络劣化的解决过程 如何防止网络质量劣化? 结语…

【图像检索】基于傅里叶描述子的形状特征图像检索,matlab实现

博主简介:matlab图像代码项目合作(扣扣:3249726188) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于傅里叶描述子的形状特征图像检索,用matlab实现。 一、案例背景和算法…

Python 序列( 列表 字典 元组 集合)

列表简介: 1.列表:用于存储任意数目、任意类型的数据集合。 2.列表是内置可变序列,是包含多个元素的有序连续的内存空间。列表的标准语法格式:a[10,20,30,40]其中,10,20,30,40这些称为:列表a的元素。 3.…

2024年“华为杯”研赛第二十一届中国研究生数学建模竞赛解题思路|完整代码论文集合

我是Tina表姐,毕业于中国人民大学,对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在,我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…

尚硅谷javaweb笔记

1、基本概念 1.1、前言 web开发: web,网页的意思,www.baidu.com 静态web html,css 提供给所有人看的数据始终不会发生变化! 动态web 淘宝,几乎是所有的网站; 提供给所有人看的数据始终会发生变化&…

xxl-job demo下载部署测试

0.简要介绍 XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 1.下载 官网地址 gitee 2.准备 安装mysql,并在数据库中导入xxl-job必须的表&#…

利士策分享,周末时光:一场自我充实的精致规划

利士策分享,周末时光:一场自我充实的精致规划 在这个快节奏的生活中,周末仿佛是我们心灵的避风港,是忙碌一周后的温柔慰藉。如何充分利用这宝贵的48小时,让身心得到真正的放松与成长,成为了许多人探索的课…

IBM Spectrum LSF 用户基础

获取 IBM Spectrum LSF 工作负载管理概念和操作的概述。 1、IBM Spectrum LSF 概述 LSF 如何满足您的作业需求并找到运行该作业的最佳资源。 - IBM Spectrum LSF IBM Spectrum LSF (“LSF” ,简称为负载共享设施) 软件是业界领先的企业级软件。 LSF 在现有异构 I…

Day69补 前后端分离思想

ajax前后端分离 前后端分离处理:前端------(数据)-----服务端----(数据)-----前端-----动态改变页面的内容 1.json 1、JSON:由于JSON易读以及纯文本格式的特性,可以非常容易地与其他程序进行沟通…

Xinstall全链路解决方案,让社交App推广效果倍增!

随着互联网的飞速发展,社交App如雨后春笋般涌现,然而,如何在激烈的市场竞争中脱颖而出,成为每个推广者亟待解决的问题。今天,就让我们来揭秘Xinstall如何助力社交App打破运营推广瓶颈,让你的推广之路更加顺…

MyBatis 基本操作 - XML版

目录 配置xml文件 一&#xff0c;查询 - Select 1.1 全列查询 1.2 赋值问题 二&#xff0c;新增 - insert 2.1 使用对象插入 2.2 获取主键 三&#xff0c;删除 - delete 四&#xff0c;修改 - update 配置xml文件 <?xml version"1.0" encoding"U…

井盖状态检测数据集

井盖状态检测数据集 yolo格式 五种类别&#xff1a;broke(井盖破损)&#xff0c;good(完好)&#xff0c;circle(边圈破损)&#xff0c;lose(井盖丢失)&#xff0c;uncovered(井盖位移/未覆盖全) 训练数据已划分&#xff0c;配置文件稍做路径改动即可训练。 训练集&#xff1a;1…

k8s 中的 Ingress 简介

一、关于 Ingress Ingress 是 K8s 中的一个 API 对象&#xff0c;用于管理和配置外部对集群内服务的访问。它可定义 HTTP 和 HTTPS 路由规则&#xff0c;将请求从集群外部的负载均衡器引导到相应的服务。Ingress 的灵活性使得我们能够实现高级的应用程序路由、SSL 终端和负载均…

【代码随想录Day22】回溯算法Part01

理论基础 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;带你学透回溯算法&#xff08;理论篇&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_bilibili 回溯算法模板框架&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&…

深兰科技荣获“2024年度人工智能最具商业合作价值企业”奖

9月19日&#xff0c;以“释放AI应用价值&#xff0c;发展新质生产力”为主题的“AIAC2024人工智能应用大会”在北京隆重举行。大会揭晓了“AI卓智奖”年度人工智能创新评选的获奖榜单&#xff0c;深兰科技荣获“2024年度人工智能最具商业合作价值企业”称号&#xff0c;同时&am…

【老板必看!】电脑怎么看使用软件时间记录?一文读懂5种超实用的方法!

在企业管理中&#xff0c;电脑虽不善言语、不会说话&#xff0c;但会留下无数线索&#xff0c;就像一场未解之谜&#xff0c;等待着各位福尔摩斯得到来&#xff0c;去揭开它的秘密面纱。 你是否曾好奇过&#xff0c;当你不在的时候&#xff0c;员工都在用电脑都在忙些什么&…

超重磅!青否交互式数字人2.0正式发布,支持流式输入!

青否交互式数字人自今年1月10日发布后&#xff0c;好评不断&#xff01;是行业内第一家支持交互式数字人源码独立部署的。 今天&#xff0c;交互式数字人2.0版本重磅发布&#xff01; 0.5秒反应速度 数字人克隆和声音克隆算法深度优化&#xff0c;支持流式输入&#xff0c;交互…

全志A133 android10 适配EC20 4G模块

一&#xff0c;移植适配 1. 驱动移植 代码路径&#xff1a;longan/kernel/linux-4.9/drivers/usb/serial/option.c diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 9f96dd2..2f25466 100644 --- a/drivers/usb/serial/option.cb/drivers/us…

12.第二阶段x86游戏实战2-CE找基地址

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…