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

  

 

posted @   ®Geovin Du Dream Park™  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
历史上的今天:
2009-10-22 Top 126 Ajax Tutorials
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5
点击右上角即可分享
微信分享提示