Python: Facade Pattern
DuFacade.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | import os import re import threading # 外观模式 Facade Pattern class _IgnitionSystem( object ): @staticmethod def produce_spark(): return True class _Engine( object ): def __init__( self ): self .revs_per_minute = 0 def turnon( self ): self .revs_per_minute = 2000 def turnoff( self ): self .revs_per_minute = 0 class _FuelTank( object ): def __init__( self , level = 30 ): self ._level = level @property def level( self ): return self ._level @level .setter def level( self , level): self ._level = level class _DashBoardLight( object ): def __init__( self , is_on = False ): self ._is_on = is_on def __str__( self ): return self .__class__.__name__ @property def is_on( self ): return self ._is_on @is_on .setter def is_on( self , status): self ._is_on = status def status_check( self ): if self ._is_on: print ( "{}: 开启" . format ( str ( self ))) else : print ( "{}: 关闭" . format ( str ( self ))) class _HandBrakeLight(_DashBoardLight): pass class _FogLampLight(_DashBoardLight): pass class _Dashboard( object ): def __init__( self ): self .lights = { "手刹" : _HandBrakeLight(), "雾" : _FogLampLight()} def show( self ): for light in self .lights.values(): light.status_check() # Facade 列要对齐,否则方法(函数)调用不出来 Geovin Du,geovindu,涂聚文注,格式很关键 class Car( object ): def __init__( self ): self .ignition_system = _IgnitionSystem() self .engine = _Engine() self .fuel_tank = _FuelTank() self .dashboard = _Dashboard() @property def km_per_litre( self ): return 17.0 def consume_fuel( self , km): litres = min ( self .fuel_tank.level, km / self .km_per_litre) self .fuel_tank.level - = litres def start( self ): print ( "\n开始启动..." ) self .dashboard.show() if self .ignition_system.produce_spark(): self .engine.turnon() else : print ( "不能开始。点火系统故障" ) def has_enough_fuel( self , km, km_per_litre): litres_needed = km / km_per_litre if self .fuel_tank.level > litres_needed: return True else : return False def drive( self , km = 100 ): print ( "\n" ) if self .engine.revs_per_minute > 0 : while self .has_enough_fuel(km, self .km_per_litre): self .consume_fuel(km) print ( "geovindu开车 {}km" . format (km)) print ( "剩余的燃料 {:.2f}l " . format ( self .fuel_tank.level)) else : print ( "不能开车。引擎已关闭!" ) def park( self ): print ( "\n停车..." ) self .dashboard.lights[ "手刹" ].is_on = True self .dashboard.show() self .engine.turnoff() def switch_fog_lights( self , status): print ( "\n切换 {} 雾灯..." . format (status)) boolean = True if status = = "ON" else False self .dashboard.lights[ "雾" ].is_on = boolean self .dashboard.show() def fill_up_tank( self ): print ( "\n油箱已满!" ) self .fuel_tank.level = 100 # the main function is the Client def main(): car = Car() car.start() car.drive() car.switch_fog_lights( "ON" ) car.switch_fog_lights( "OFF" ) car.park() car.fill_up_tank() car.drive() car.start() car.drive() |
调用:
main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 外观模式 Facade Pattern # DuFacade.main() car = DuFacade.Car() car.start() car.drive() car.switch_fog_lights( "ON" ) car.switch_fog_lights( "OFF" ) car.park() car.fill_up_tank() car.drive() car.start() car.drive() |
输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | 开始启动... _HandBrakeLight: 关闭 _FogLampLight: 关闭 开车 100km 剩余的燃料 24.12l 开车 100km 剩余的燃料 18.24l 开车 100km 剩余的燃料 12.35l 开车 100km 剩余的燃料 6.47l 开车 100km 剩余的燃料 0.59l 切换 ON 雾灯... _HandBrakeLight: 关闭 _FogLampLight: 开启 切换 OFF 雾灯... _HandBrakeLight: 关闭 _FogLampLight: 关闭 停车... _HandBrakeLight: 开启 _FogLampLight: 关闭 油箱已满! 不能开车。引擎已关闭! 开始启动... _HandBrakeLight: 开启 _FogLampLight: 关闭 开车 100km 剩余的燃料 94.12l 开车 100km 剩余的燃料 88.24l 开车 100km 剩余的燃料 82.35l 开车 100km 剩余的燃料 76.47l 开车 100km 剩余的燃料 70.59l 开车 100km 剩余的燃料 64.71l 开车 100km 剩余的燃料 58.82l 开车 100km 剩余的燃料 52.94l 开车 100km 剩余的燃料 47.06l 开车 100km 剩余的燃料 41.18l 开车 100km 剩余的燃料 35.29l 开车 100km 剩余的燃料 29.41l 开车 100km 剩余的燃料 23.53l 开车 100km 剩余的燃料 17.65l 开车 100km 剩余的燃料 11.76l 开车 100km 剩余的燃料 5.88l 开车 100km 剩余的燃料 0.00l Process finished with exit code 0 |
哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)
分类:
Python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
2009-10-22 Top 126 Ajax Tutorials