python设计模式-适配器设计模式,装饰器设计模式

news2025/1/17 3:49:48

适配器设计模式

适配器模式可用作两个不兼容接口之间的桥梁。 这种类型的设计模式属于结构模式,因为此模式结合了两个独立接口的功能。
这种模式涉及一个类,它负责连接独立或不兼容接口的功能。 一个现实的例子是读卡器,它是存储卡和笔记本电脑之间的适配器。 您将存储卡插入读卡器,将读卡器插入笔记本电脑,以便通过笔记本电脑读取存储卡。
适配器设计模式有助于类能在一起工作。 它根据需求将一个类的接口转换为另一个接口。 该模式包括一个多态性,它命名一个名称和多个形式。 根据收集到的要求,生成一个使用的形状类。
适配器模式有两种类型 -

  • 对象适配器模式 - 这种设计模式依赖于对象实现。 因此,它被称为对象适配器模式。
  • 类适配器模式 - 这是实现适配器设计模式的另一种方式。 该模式可以使用多重继承来实现。

如何实现适配器模式?

现在让我们看看如何实现适配器模式。参考以下代码

class EuropeanSocketInterface:
   def voltage(self): pass

   def live(self): pass
   def neutral(self): pass
   def earth(self): pass

# Adaptee
class Socket(EuropeanSocketInterface):
   def voltage(self):
      return 230

    def live(self):
      return 1

   def neutral(self):
      return -1

   def earth(self):
      return 0

# Target interface
class USASocketInterface:
   def voltage(self): pass
   def live(self): pass
   def neutral(self): pass

# The Adapter
class Adapter(USASocketInterface):
   __socket = None
   def __init__(self, socket):
      self.__socket = socket

   def voltage(self):
      return 110

   def live(self):
      return self.__socket.live()

   def neutral(self):
      return self.__socket.neutral()

# Client
class ElectricKettle:
   __power = None

   def __init__(self, power):
       self.__power = power

   def boil(self):
      if self.__power.voltage() > 110:
         print "Kettle on fire!"
      else:
         if self.__power.live() == 1 and \
            self.__power.neutral() == -1:
            print "Coffee time!"
         else:
            print "No power."

def main():
   # Plug in
   socket = Socket()
   adapter = Adapter(socket)
   kettle = ElectricKettle(adapter)

   # Make coffee
   kettle.boil()

   return 0

if __name__ == "__main__":
   main()

执行上面示例代码,得到以上结果
在这里插入图片描述
说明:代码包括具有各种参数和属性的适配器接口。 它包括Adaptee和Target接口,它实现所有属性并将输出显示为可见。

装饰器设计模式

装饰器模式允许用户在不改变其结构的情况下向现有对象添加新功能。 这种类型的设计模式属于结构模式,因为此模式充当现有类的包装。
这个模式创建了一个装饰器类,它封装了原始类,并提供了额外的功能,保持了类方法签名的完整性。
装饰者模式的动机是动态地附加对象的额外职责(功能)。

如何实现装饰设计模式?

下面提到的代码是如何在Python中实现装饰器设计模式的简单演示。 该示例涉及以类形式展示咖啡店(coffeeshop类)。 创建的 coffee 类是一个抽象类,这意味着它不能被实例化

import six
from abc import ABCMeta

@six.add_metaclass(ABCMeta)
class Abstract_Coffee(object):

   def get_cost(self):
      pass

   def get_ingredients(self):
      pass

   def get_tax(self):
      return 0.1*self.get_cost()

class Concrete_Coffee(Abstract_Coffee):

   def get_cost(self):
      return 1.00

   def get_ingredients(self):
      return 'coffee'

@six.add_metaclass(ABCMeta)
class Abstract_Coffee_Decorator(Abstract_Coffee):

   def __init__(self,decorated_coffee):
      self.decorated_coffee = decorated_coffee

   def get_cost(self):
      return self.decorated_coffee.get_cost()

   def get_ingredients(self):
      return self.decorated_coffee.get_ingredients()

class Sugar(Abstract_Coffee_Decorator):

   def __init__(self,decorated_coffee):
      Abstract_Coffee_Decorator.__init__(self,decorated_coffee)

   def get_cost(self):
      return self.decorated_coffee.get_cost()

   def get_ingredients(self):
       return self.decorated_coffee.get_ingredients() + ', sugar'

class Milk(Abstract_Coffee_Decorator):

   def __init__(self,decorated_coffee):
      Abstract_Coffee_Decorator.__init__(self,decorated_coffee)

   def get_cost(self):
      return self.decorated_coffee.get_cost() + 0.25

   def get_ingredients(self):
      return self.decorated_coffee.get_ingredients() + ', milk'

class Vanilla(Abstract_Coffee_Decorator):

   def __init__(self,decorated_coffee):
      Abstract_Coffee_Decorator.__init__(self,decorated_coffee)

   def get_cost(self):
      return self.decorated_coffee.get_cost() + 0.75

   def get_ingredients(self):
      return self.decorated_coffee.get_ingredients() + ', vanilla'

如下所述,coffeeshop抽象类的实现是通过一个单独的文件完成的

import coffeeshop

myCoffee = coffeeshop.Concrete_Coffee()
print('Ingredients: '+myCoffee.get_ingredients()+
   '; Cost: '+str(myCoffee.get_cost())+'; sales tax = '+str(myCoffee.get_tax()))

myCoffee = coffeeshop.Milk(myCoffee)
print('Ingredients: '+myCoffee.get_ingredients()+
   '; Cost: '+str(myCoffee.get_cost())+'; sales tax = '+str(myCoffee.get_tax()))

myCoffee = coffeeshop.Vanilla(myCoffee)
print('Ingredients: '+myCoffee.get_ingredients()+
   '; Cost: '+str(myCoffee.get_cost())+'; sales tax = '+str(myCoffee.get_tax()))

myCoffee = coffeeshop.Sugar(myCoffee)
print('Ingredients: '+myCoffee.get_ingredients()+
   '; Cost: '+str(myCoffee.get_cost())+'; sales tax = '+str(myCoffee.get_tax()))

执行上述程序生成以下输出
在这里插入图片描述

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

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

相关文章

超多免费API接口分享

分享一下近段时间在网上看的超多免费API接口,赶紧收藏起来吧! 一、APISpace 为超过100 万开发者提供专业的 API 服务,包括 API 管理、测试、访问控制等功能,让您无忧探索广阔的API世界~所有接口提供免费试用 https://www.apisp…

【最坏贪心】代码源每日一题div1 排列 2023.02.03

排列 - 题目 - Daimayuan Online Judge今天牛牛完结撒花辣!但是我还没补完题,感觉这几场rk都差不多,但是总体来说感觉签到签的有点困难,然后好不容易开到算法题,算法的题也最多只能出一题然后后面这几天除了vpCF&#…

现在都这么拽吗?面试一个工作4年的测试工程师,连自动化基础都搞不清楚,还反过来怼我....

年后招聘黄金期,我们公司也开始大量招人了,我这次是公司招聘的面试官之一,主要负责一些技术上的考核,这段时间还真让我碰到了不少奇葩求职者 昨天公司的HR小席刚跟我吐槽:这几个星期没有哪天不加班的!各种…

代码随想录 day55动态规划 回文子串

代码随想录 day55动态规划 回文子串 题647 回文子串 动态规划解法: 1,确定dp数组以及下标的含义 对于绝大多数题目来说,题目求什么dp数组就定义为什么,但此题如果定义,dp[i] 为 下标i结尾的字符串有 dp[i]个回文串的…

【2003NOIP普及组】T3.栈 试题解析

【2003NOIP普及组】T3.栈 试题解析 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表。 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈)。 栈的重要…

对比coco anationtions和coco result的数据保存形式

一、背景 coco anationtions是coco数据集提供的数据标签,coco result是预测的结果的形式,方便用pycocotools计算模型的map等指标。 二、两种数据形式对比 1. coco anationtions的形式 以person_keypoints_val2017.json为例。整体结构如下图 是一个字…

服务器搭建原神私服教程

1. 准备工具这个端在Windows、Linux系统上都可以跑,本次教程基于Linux。准备如下工具服务器1台 centos7 系统 最低配置8核16G 如需公网联机可用云服务器手保证云服务器的443端口未使用(服务器上没有网站)2. 环境配置安装系统依赖环境yum -y i…

揭密字节跳动薪资职级,资深测试居然能拿......

曾经的互联网是PC的时代,随着智能手机的普及,移动互联网开始飞速崛起。而字节跳动抓住了这波机遇,2015年,字节跳动全面加码短视频,从那以后,抖音成为了字节跳动用户、收入和估值的最大增长引擎。 自从字节逐…

论文阅读_模型鲁棒性的量化指标

论文信息 name_en: Robustness Metrics:How Are They Calculated, When Should They Be Used and Why Do They Give Different Results? name_ch: 鲁棒性度量:它们是如何计算的,何时应该使用以及为什么会给出不同的结果? addr: http://doi…

软件工程(2)--瀑布模型

前言 这是基于我所学习的软件工程课程总结的第二篇文章。 在20世纪80年代之前,瀑布模型一直是唯一被广泛采用的生命周期模型,现在它仍然是软件工程中应用得最广泛的过程模型。传统软件工程方法学的软件过程,基本上可以用瀑布模型来描述。 正…

【OpenGL学习】光照贴图

光照贴图 上节中我们给物体添加了材质,使得物体能够对光照做出不同的反应,但是有个问题就是,使用该种材质的物体,只能够表现出我们所定义的一种性质,而实际生活中我们的一个物体往往具有多种材质,因此本节…

一文了解jquery

簡述本文主要介紹jquery的重要語法功能,如選擇器,dom操作,事件等處理操作什麼jquery?jquery由美国人John Resig(约翰莱西格)于2006年创建 ,是目前最流行的JavaScript程序库。以輕量,代碼簡潔&am…

windows快速切换jdk版本号

前言 因为老项目和新项目的需要,在电脑上需要切换jdk1.8和jdk17(其它版本jdk同样可以切换)。网上有修改配置文件的方式,但是感觉比较繁琐,后来找到了通过bat文件和环境变量来快速切换jdk环境的方法。这里记录分享出出…

rclone挂载webdav详细步骤(含脚本)

挂载说明 文章目录挂载说明文件下载地址:文件夹及文件说明windows安装、配置和挂载操作步骤安装新建连接配置挂载开机自启linux安装、配置和挂载操作步骤安装新建连接配置,见 [链接新建连接配置](#新建连接配置)挂载linux开机自启文件下载地址: 文件下载…

如何实现前端全屏

前言 最近有个需求是要求免登录自动打开看板,然后全屏并播放视频。当然最后自动全屏并播放视频没有实现,写这篇文章是为了记录一下踩的坑。 全屏 网上有挺多现成的组件的,这里就不介绍了,可以自行百度。这里只说通过原生的方法…

手机更换电池-小米8se操作步骤

目录 准备工具: 步骤: 注意事项: 准备工具: 需要更换电池的手机电池背胶(左上蓝色)缠胶棍(手机左边)小螺丝刀新电池卡针后盖拆卸片(右上三角)吸盘后盖背胶 …

Cesium 点位聚合

实现效果 实现方式 通过 new Cesium.EntityCluster(options) 接口对象实现而 new Cesium.DataSource() 有成员变量 clusteringclustering 类型是 EntityCluster代码实现,基于 vue 前端框架 这里使用的是 cesium 沙盒演示中自带的数据进行实现 加载数据 getKMLDTSource() {let o…

cnetsdk:.NET OCR SDK-支持中文-Crack

产品概览 .NET OCR SDK 许可证和价格 OCR SDK 兼容性 CnetSDK .NET OCR Scanner SDK兼容.NET Framework 4.0及以上版本。此 OCR 库软件可用于在任何 CPU 上进行 .NET OCR Windows 和基于服务器的应用程序开发。我们为 x86 和 x64 系统提供 OCR 库解决方案。 OCR 图像格式 这个 …

[学习笔记]黑马程序员-Hadoop入门视频教程

文章目录参考资料大数据导论企业数据分析方向数据分析基本流程步骤明确分析的目的和思路数据收集数据处理数据分析数据展现报告攥写大数据时代大数据定义大数据的5V特征参考资料 黑马程序员大数据Hadoop入门视频教程,适合零基础自学的大数据Hadoop教程 目录 大数据…

C++ 面试题-设计模式类问题(万余字总结)

C 面试题-设计模式类问题1 、说说什么是单例设计模式,如何实现2、 简述一下单例设计模式的懒汉式和饿汉式,如何保证线程安全3、 请说说工厂设计模式,如何实现,以及它的优点4 、请说说装饰器计模式,以及它的优缺点5 、请…