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

基于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.xdnf.cn/news/12748.html

相关文章:

  • CppCon 2015 学习:Intro to the C++ Object Model
  • 能上Nature封面的idea!强化学习+卡尔曼滤波
  • Appium+python自动化(十二)- Android UIAutomator
  • [TI板]MSPM0G3507学习笔记(一) 超详细keil环境配置+烧录配置+空工程迁移+vscode配置+点灯
  • PyCharm集成Conda环境
  • 北大开源音频编辑模型PlayDiffusion,可实现音频局部编辑,比传统 AR 模型的效率高出 50 倍!
  • 【网站建设】网站 SEO 中 meta 信息修改全攻略 ✅
  • OkHttp 3.0源码解析:从设计理念到核心实现
  • SOC-ESP32S3部分:33-声学前端模型ESP-SR
  • 开疆智能Ethernet/IP转Modbus网关连接鸣志步进电机驱动器配置案例
  • Mac版Visual Studio Code Copilot 无法使用的解决方法
  • FSMC扩展外部SRAM
  • 服务器新建用户无法使用conda
  • 【python与生活】如何构建一个解读IPO招股书的算法?
  • QT进阶之路:带命名空间的自定义控件在Qt设计器与qss中的使用技巧
  • Android音频开发:Speex固定帧与变长帧编解码深度解析
  • Windows账户管理,修改密码,创建帐户...(无需密码)
  • k3s入门教程(集群部署、使用,镜像拉取失败网络问题排查)
  • C++.OpenGL (2/64)你好,三角形(Hello Triangle)
  • N2语法 列挙、話題提出
  • 黑盒测试用例设计方法-全
  • gvim比较两个文件不同并合并差异
  • 【三余升序数对个数】2022-4-17
  • 数学:学好数学需要对数系进行系统的对比和分析
  • 蓝牙技术栈BR/EDR和LE详解
  • Linux驱动学习day1
  • Numpy5——数组的扩充(相加、复制、广播)排序,形状调整
  • 计算机图形学:(七)渲染目标
  • MybatisPlus中LambdaQueryWrapper 校验非空,非空判断
  • 解决cesium加载模型太黑暗,程序崩溃,不显示,位置不对模型太大,Cesium加载gltf/glb模型后变暗,变慢问题