适配器模式

# 类似于变压器  使得原本由于接口不兼容而不能一起工作的那些类可以一起工作"""
内容:将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
角色:目标接口(Target)待适配的类(Adaptee)适配器(Adapter)
两种实现方式:类适配器:使用多继承对象适配器:使用组合
"""
# 适用场景
"""
适用场景:
想使用一个已经存在的类,而它的接口不符合你的要求
(对象适配器)想使用一些已经存在的子类,但不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
"""

代码实现

from abc import abstractmethod, ABCMetaclass Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):raise NotImplementedErrorclass Alipay(Payment):def pay(self, money):print("支付宝支付%s元" % money)class ApplePay(Payment):def pay(self, money):print("苹果支付%s元" % money)# ------待适配类------
class PaymentB(metaclass=ABCMeta):@abstractmethoddef huaqian(self, money):raise NotImplementedErrorclass WechatPay(PaymentB):def huaqian(self, money):print("微信支付%s元" % money)class BankPay(PaymentB):def huaqian(self, money):print("银行卡支付%s元" % money)# ------类适配器------class RealWeChatPay(Payment, WechatPay):def pay(self, money):return self.huaqian(money)p = Alipay()
p = RealWeChatPay()
p.pay(100)# ------对象适配器------
class PayAdapter(Payment):def __init__(self, payment):self.payment = paymentdef pay(self, money):return self.payment.huaqian(money)p = Alipay()
p = PayAdapter(BankPay())
p.pay(1000)# PayAdapter(WechatPay()).pay(1000)

代理模式

"""
内容:为其他对象提供一种代理以控制对这个对象的访问。
角色:抽象实体(Subject)实体(RealSubject)代理(Proxy)
适用场景:远程代理:为远程的对象提供代理  # 对象在远程服务器虚代理:根据需要创建很大的对象保护代理:控制对原始对象的访问,用于对象有不同访问权限时
优点:远程代理:可以隐藏对象位于远程地址空间的事实虚代理:可以进行优化,例如根据要求创建对象保护代理:允许在访问一个对象时有一些附加的内务处理
"""

代码实现

from abc import ABCMeta, abstractmethodclass Subject(metaclass=ABCMeta):@abstractmethoddef get_content(self):pass@abstractmethoddef set_content(self, content):passclass RealSubject(Subject):def __init__(self, filename):self.filename = filenameprint("读取%s文件内容" % filename)f = open(filename, encoding='utf-8')self.content = f.read()f.close()def get_content(self):return self.contentdef set_content(self, content):f = open(self.filename, 'w', encoding='utf-8')f.write(content)f.close()# 虚代理
class ProxyB(Subject):def __init__(self, filename):self.filename = filenameself.subj = Nonedef get_content(self):if not self.subj:self.subj = RealSubject(self.filename)return self.subj.get_content()s = ProxyB("test.py")# print(s.get_content())class ProxyC(Subject):def __init__(self, filename):self.subj = RealSubject(filename)def get_content(self):self.subj.get_content()def set_content(self, content):raise PermissionError("没有写权限")# 写一个set_content

1

转载于:https://www.cnblogs.com/daofaziran/p/11007083.html

设计模式-结构性模式相关推荐

  1. 设计模式(三)结构性模式

    3 结构性模式 结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关 ...

  2. 23种设计模式——桥接模式

    文章目录 23种设计模式--桥接模式 1.桥接模式概述 2.桥接模式结构 3.桥接模式的实现 4.桥接模式的注意事项和细节 23种设计模式--桥接模式 1.桥接模式概述 桥接模式介绍 桥接(Bridg ...

  3. Python设计模式-建造者模式

    Python设计模式-建造者模式 代码基于3.5.2,代码如下; #coding:utf-8 #建造者模式 class Burger():name = ""price = 0.0d ...

  4. Python设计模式-状态模式

    Python设计模式-状态模式 代码基于3.5.2,代码如下; #coding:utf-8 #状态模式class state():def writeProgram(self,work):raise N ...

  5. Python设计模式-备忘录模式

    Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...

  6. Python设计模式-解释器模式

    Python设计模式-解释器模式 代码基于3.5.2,代码如下; #coding:utf-8 #解释器模式class PlayContext():play_text = Noneclass Expre ...

  7. Python设计模式-命令模式

    Python设计模式-命令模式 代码基于3.5.2,代码如下; #coding:utf-8 #命令模式class barbecuer():def bakeButton(self):print(&quo ...

  8. Python设计模式-策略模式

    Python设计模式-策略模式 代码基于3.5.2,代码如下; #coding:utf-8 #策略模式class sendInterface():def send(self,value):raise ...

  9. Python设计模式-外观模式

    Python设计模式-外观模式 代码基于3.5.2,代码如下; #coding:utf-8 # 外观模式class AlarmSensor:def run(self):print("Alar ...

最新文章

  1. 波士顿房价数据可视化
  2. Kafka 安装配置及快速入门
  3. when to book didi?
  4. python输出假分数_分数的表示以及计算(c++)
  5. java命令模式返回值_JAVA 设计模式 命令模式
  6. LR为什么用极大似然估计,损失函数为什么是log损失函数(交叉熵)
  7. ADBPGGreenplum成本优化之磁盘水位管理
  8. SQLi LABS Less-35
  9. sql注入检测工具 mysql_SQL注入测试
  10. MKS_SGEN_L V1.0 marlin 固件编译
  11. 路由器 RIP-2 配置
  12. 网络游戏(MMORPG) 好玩的原因
  13. android时间24小时,安卓时间显示TextClock显示日期时间,24小时制和12小时制(自定义...
  14. 区块链进化论:极客与开源 - 区块链大航海时代
  15. android studio高德地图的显示于定位(附带逆地理编码围栏)
  16. 英文pdf文件的翻译问题
  17. DaisyDisk for Mac(mac磁盘清理软件)
  18. 2022大作业项目报告
  19. Linux系统漏洞本地提权
  20. gradle 缓存的jar包仓库的目录在哪

热门文章

  1. python安装没有pip选项_python-3.x – 在ubuntu上没有pip的python安装
  2. 分时线的9代表什么_为什么要打板?资深股民分享打板技巧和思路,句句精辟!...
  3. python socket代码_python入门之socket代码练习
  4. 中断技术在计算机系统中的应用,中斷在操作系统中的应用.doc
  5. android activity跳转多次闪退_Android实现Activity和Fragment的跳转动画
  6. oracle11g到底是什么6,Oracle11g六个重要进程
  7. 【深度学习入门到精通系列】 深入浅出强化学习 Sarsa
  8. mysql编辑表php源码_MySQL修改表的实际应用代码示例
  9. java 随机数生成实现_Java中生成随机数的实现方法总结
  10. r - 求平均成绩_学霸秘籍:小学数学知识点例题讲解 — 平均数问题