门面(facade)设计模式为子系统中的一组接口提供统一的接口。 它定义了任何子系统都可以使用的更高级别的接口。
一个门面(facade)类知道哪个子系统负责请求。
现在让我们看看如何设计一个门面(facade)设计模式。参考以下实现代码 -
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("{}: on".format(str(self)))
else:
print("{}: off".format(str(self)))
class _handbrakelight(_dashboardlight):
pass
class _foglamplight(_dashboardlight):
pass
class _dashboard(object):
def __init__(self):
self.lights = {"handbreak": _handbrakelight(), "fog": _foglamplight()}
def show(self):
for light in self.lights.values():
light.status_check()
# facade
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("\nstarting...")
self.dashboard.show()
if self.ignition_system.produce_spark():
self.engine.turnon()
else:
print("can't start. faulty ignition system")
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("drove {}km".format(km))
print("{:.2f}l of fuel still left".format(self.fuel_tank.level))
else:
print("can't drive. the engine is turned off!")
def park(self):
print("\nparking...")
self.dashboard.lights["handbreak"].is_on = true
self.dashboard.show()
self.engine.turnoff()
def switch_fog_lights(self, status):
print("\nswitching {} fog lights...".format(status))
boolean = true if status == "on" else false
self.dashboard.lights["fog"].is_on = boolean
self.dashboard.show()
def fill_up_tank(self):
print("\nfuel tank filled up!")
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()
if __name__ == "__main__":
main()
执行上面程序,生成以下输出 -
注意:这个程序是设计一个场景。 这是启动汽车或任何车辆的发动机。 如果您观察代码,它还包括驱动,停车和消耗燃料的相关功能。