Python设计模式 专题
您的位置:python > Python设计模式专题 > 门面(Facade)设计模式
门面(Facade)设计模式
作者:--    发布时间:2019-11-20

门面(facade)设计模式为子系统中的一组接口提供统一的接口。 它定义了任何子系统都可以使用的更高级别的接口。

一个门面(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()

执行上面程序,生成以下输出 -

注意:这个程序是设计一个场景。 这是启动汽车或任何车辆的发动机。 如果您观察代码,它还包括驱动,停车和消耗燃料的相关功能。


网站声明:
本站部分内容来自网络,如您发现本站内容
侵害到您的利益,请联系本站管理员处理。
联系站长
373515719@qq.com
关于本站:
编程参考手册