设计模式七:外观模式
什么是外观模式
有助于隐藏系统的内部复杂性,并通过一个简化的接口向客户端暴露必要的部分,这就是外观模式
使用场景
要为一个复杂系统提供单个简单的入口点时,就可以使用此模式
优点:
1.可以改变系统内部代码,但是客户端代码不用关心也不受影响。
2.在多层系统中,可以为每一层引入一个外观接口,并让所有层级通过这些外观相互通信,提高了层级之间的松耦合性,尽可能保持层级独立。
典型案例
启动一台电脑,不会把内存、硬盘CPU加点运行,引导加载程序,CPU启动操作系统内核等这些复杂性暴露给客户端,而是创建一个外观(启动键)来封装整个过程,并且保证所有步骤按正确的次序运行。
补充知识
ABCMeta 抽象基类
1.需要使用metaclass关键字继承ABCmeta
2.使用@abstractmethod修饰器声明的方法在子类中必须实现
实例代码
from abc import ABCMeta,abstractmethod
class Hardware(metaclass=ABCMeta):
#定义硬件基类,子类必须实现 getpower start off 三个方法
@abstractmethod
def __init__(self):
pass
def __str__(self):
pass
@abstractmethod
def getpower(self):
pass
@abstractmethod
def start(self):
pass
@abstractmethod
def off(self):
pass
class CPU(Hardware):
def __init__(self):
self.name = 'CPU'
def getpower(self):
print('{} get power.... '.format(self.name))
def start(self):
print('{} start ............OK'.format(self.name))
def off(self):
print('{} off ............OK'.format(self.name))
class Disk(Hardware):
def __init__(self):
self.name = 'Disk'
def getpower(self):
print('{} get power.... '.format(self.name))
def start(self):
print('{} start ............OK'.format(self.name))
def off(self):
print('{} off ............OK'.format(self.name))
class Memory(Hardware):
def __init__(self):
self.name = 'Memory'
def getpower(self):
print('{} get power.... '.format(self.name))
def start(self):
print('{} start ............OK'.format(self.name))
def off(self):
print('{} off ............OK'.format(self.name))
class Computer:
#外观
def __init__(self):
#创建所有需要的硬件类实例
self.name = 'Computer'
self.cpu = CPU()
self.disk = Disk()
self.memory = Memory()
def start(self):
#启动入口
self.cpu.getpower()
self.disk.getpower()
self.memory.getpower()
self.memory.start()
self.disk.start()
self.cpu.start()
print('{} start ............OK'.format(self.name))
def off(self):
#关闭入口
self.cpu.off()
self.memory.off()
self.disk.off()
print('{} off ............OK'.format(self.name))
def main():
pc = Computer()
#用户只需要知道启动方法,无需知道启动细节,下面关闭同理
pc.start()
print()
pc.off()
if __name__ == "__main__":
main()