当前位置: 首页 > news >正文

基于Python学习《Head First设计模式》第七章 适配器和外观模式

适配器模式

了解适配器

在这里插入图片描述
在这里插入图片描述

简单示例

在这里插入图片描述


class Duck(ABC):"""鸭子"""@abstractmethoddef quack(self):pass@abstractmethoddef fly(self):passclass MallardDuck(Duck):"""绿头鸭"""def quack(self):print("Quack")def fly(self):print("I'm flying")class Turkey(ABC):"""火鸡"""@abstractmethoddef gobble(self):pass@abstractmethoddef fly(self):pass

在这里插入图片描述


class WildTurkey(Turkey):"""野鸡"""def gobble(self):print('Gobble gobble')def fly(self):print("I'm flying a short distance")class TurkeyAdapter(Duck):turkey: Turkeydef __init__(self, turkey: Turkey):self.turkey = turkeydef quack(self):self.turkey.gobble()def fly(self):for _ in range(5):self.turkey.fly()

在这里插入图片描述

if __name__ == '__main__':duck = MallardDuck()turkey = WildTurkey()turkey_adapter = TurkeyAdapter(turkey)print('The Turkey says...')turkey.gobble()turkey.fly()print('\nThe Duck says...')duck.quack()duck.fly()print('\nThe TurkeyAdapter says...')turkey_adapter.quack()turkey_adapter.fly()

完整代码

from abc import ABC, abstractmethodclass Duck(ABC):"""鸭子"""@abstractmethoddef quack(self):pass@abstractmethoddef fly(self):passclass MallardDuck(Duck):"""绿头鸭"""def quack(self):print("Quack")def fly(self):print("I'm flying")class Turkey(ABC):"""火鸡"""@abstractmethoddef gobble(self):pass@abstractmethoddef fly(self):passclass WildTurkey(Turkey):"""野鸡"""def gobble(self):print('Gobble gobble')def fly(self):print("I'm flying a short distance")class TurkeyAdapter(Duck):turkey: Turkeydef __init__(self, turkey: Turkey):self.turkey = turkeydef quack(self):self.turkey.gobble()def fly(self):for _ in range(5):self.turkey.fly()class DuckAdapter(Turkey):duck: Duckdef __init__(self, duck: Duck):self.duck = duckself.__reset()def __reset(self):self.rand = (_ for _ in range(4))def gobble(self):self.duck.quack()def fly(self):try:next(self.rand)except StopIteration:self.duck.fly()self.__reset()if __name__ == '__main__':duck = MallardDuck()turkey = WildTurkey()turkey_adapter = TurkeyAdapter(turkey)duck_adapter = DuckAdapter(duck)print('The Turkey says...')turkey.gobble()turkey.fly()print('\nThe Duck says...')duck.quack()duck.fly()print('\nThe TurkeyAdapter says...')turkey_adapter.quack()turkey_adapter.fly()print('\nThe DuckAdapter says...')duck_adapter.gobble()for _ in range(10):duck_adapter.fly()"""运行结果:
The Turkey says...
Gobble gobble
I'm flying a short distanceThe Duck says...
Quack
I'm flyingThe TurkeyAdapter says...
Gobble gobble
I'm flying a short distance
I'm flying a short distance
I'm flying a short distance
I'm flying a short distance
I'm flying a short distanceThe DuckAdapter says...
Quack
I'm flying
I'm flying
"""

适配器模式解析

适配器包装一个被适配者
在这里插入图片描述

适配器定义

在这里插入图片描述

类适配器 VS 对象适配器

在这里插入图片描述
在这里插入图片描述
对象适配器可以适配一个被适配者类类适配器只能针对特定的被适配者类
举例: 对象适配器使用组合的方式,可以适配整个Duck类,而类适配器用继承只能支配Duck的具体类,比如绿头鸭类。

但子类类添加新的行为时,类适配器更胜一筹。
在这里插入图片描述

外观模式

项目:家庭影院

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码实现

在这里插入图片描述

class HomeTheaterFacade:"""家庭影院外观"""amp: Amplifiertunner: Tunnerplayer: StreamingPlayerprojector: Projectorlights: TheaterLightsscreen: Screenpopper: PopcornPopperdef __init__(self, amp: Amplifier, tunner: Tunner,player: StreamingPlayer,projector: Projector,lights: TheaterLights,screen: Screen,popper: PopcornPopper):self.amp = ampself.tunner = tunnerself.player = playerself.projector = projectorself.lights = lightsself.screen = screenself.popper = popper

在这里插入图片描述

    def watch_movie(self,movie:str):print('准备播放电影...')self.popper.on()self.popper.pop()self.lights.lim(10)self.screen.down()self.projector.on()self.projector.wideScrennMode()self.amp.on()self.amp.setStreamingPlayer(self.player)self.amp.setSurroundSound()self.amp.setVolume(5)self.player.on()self.player.play(movie)def end_movie(self):print('停止播放电影')self.popper.off()self.lights.on()self.screen.up()self.projector.off()self.amp.off()self.player.stop()self.player.off()

在这里插入图片描述

if __name__ == '__main__':amp = Amplifier()tunner = Tunner()player = StreamingPlayer()projector = Projector()lights = TheaterLights()screen = Screen()popper = PopcornPopper()home_theater = HomeTheaterFacade(amp, tunner, player, projector, lights, screen, popper)home_theater.watch_movie('傲慢与偏见')print()home_theater.end_movie()

完整代码

class Amplifier:"""扩音器"""def on(self):print('打开扩音器')def setStreamingPlayer(self, player):print('设置流媒体输入')def setSurroundSound(self):print('设置环绕音响')def setVolume(self, param):print(f'设置音量为{param}')def off(self):print('关闭扩音器')class Tunner:passclass StreamingPlayer:"""流媒体播放器"""def on(self):print('打开流媒体播放器')def play(self, movie):print(f'播放{movie}')def stop(self):print('停止播放')def off(self):print('关闭流媒体播放器')class Projector:"""投影机"""def on(self):print('打开投影机')def wideScrennMode(self):print('设置投影机为宽屏模式')def off(self):print('关闭投影机')class TheaterLights:"""影院灯光"""def lim(self, param):print('调暗灯光')def on(self):print('打开灯光')class PopcornPopper:"""爆米花机器"""def on(self):print('打开爆米花机器')def pop(self):print('提供爆米花')def off(self):print('关闭爆米花机器')class Screen:"""投影机的屏幕"""def down(self):print('放下屏幕')def up(self):print('收起屏幕')class HomeTheaterFacade:"""家庭影院外观"""amp: Amplifiertunner: Tunnerplayer: StreamingPlayerprojector: Projectorlights: TheaterLightsscreen: Screenpopper: PopcornPopperdef __init__(self, amp: Amplifier, tunner: Tunner,player: StreamingPlayer,projector: Projector,lights: TheaterLights,screen: Screen,popper: PopcornPopper):self.amp = ampself.tunner = tunnerself.player = playerself.projector = projectorself.lights = lightsself.screen = screenself.popper = popperdef watch_movie(self, movie: str):print('准备播放电影...')self.popper.on()self.popper.pop()self.lights.lim(10)self.screen.down()self.projector.on()self.projector.wideScrennMode()self.amp.on()self.amp.setStreamingPlayer(self.player)self.amp.setSurroundSound()self.amp.setVolume(5)self.player.on()self.player.play(movie)def end_movie(self):print('停止播放电影')self.popper.off()self.lights.on()self.screen.up()self.projector.off()self.amp.off()self.player.stop()self.player.off()if __name__ == '__main__':amp = Amplifier()tunner = Tunner()player = StreamingPlayer()projector = Projector()lights = TheaterLights()screen = Screen()popper = PopcornPopper()home_theater = HomeTheaterFacade(amp, tunner, player, projector, lights, screen, popper)home_theater.watch_movie('傲慢与偏见')print()home_theater.end_movie()"""运行结果:
准备播放电影...
打开爆米花机器
提供爆米花
调暗灯光
放下屏幕
打开投影机
设置投影机为宽屏模式
打开扩音器
设置流媒体输入
设置环绕音响
设置音量为5
打开流媒体播放器
播放傲慢与偏见停止播放电影
关闭爆米花机器
打开灯光
收起屏幕
关闭投影机
关闭扩音器
停止播放
关闭流媒体播放器
"""

外观模式定义

在这里插入图片描述

适配器模式 VS 外观模式

适配器的意图是:转化修改接口以匹配客户的期望。
外观模式的意图是:简化,提供子系统的一个简化的接口

总结

在这里插入图片描述

http://www.lqws.cn/news/200701.html

相关文章:

  • moon服务器引擎-协议生成报错
  • 意识上传伦理前夜:我们是否在创造数字奴隶?
  • Scade 语言概念 - 方程(equation)
  • 1990-2023年 地级市人工智能企业数量-社科经管实证数据
  • Linux 文件系统与 I/O 编程核心原理及实践笔记
  • Python Cookbook-7.12 在 SQLite 中储存 BLOB
  • 华为云Flexus+DeepSeek征文|Dify - LLM 云服务单机部署大语言模型攻略指南
  • 又是一年高考季
  • 台式机电脑CPU天梯图2025年6月份更新:CPU选购指南及推荐
  • 《经济学原理》第9版第6章供给、需求和政府政策
  • 性能优化笔记
  • IT学习方法与资料分享
  • Srping Cloud Gateway 跨域配置 CorsWebFilter
  • 使用 Ansible 在 Windows 服务器上安装 SSL 证书系列之二
  • Qt Quick Test模块功能及架构
  • java_网络服务相关_gateway_nacos_feign区别联系
  • DeepSeek09-open-webui使用
  • 第二十八课:深度学习及pytorch简介
  • 现代C++特性(一):基本数据类型扩展
  • 低功耗MQTT物联网架构Java实现揭秘
  • 基于Spring Boot的云音乐平台设计与实现
  • C++类和对象(上)
  • C++ 信息学奥赛总复习题(第一章)
  • 【HarmonyOS 5】运动健康开发实践介绍以及详细案例
  • K8S认证|CKS题库+答案| 5.日志审计
  • Python Cookbook-7.11 在 PostgreSQL 中储存 BLOB
  • Ubuntu下有关UDP网络通信的指令
  • (每日一道算法题)二叉树剪枝
  • 【选配电脑】CPU核显工作机控制预算5000
  • 比较数据迁移后MySQL数据库和ClickHouse数据仓库中的表