外观模式跟代理模式有点像,都是在client和目标的类之间建一个中间的类,client不直接调用目标的类,而是通过先调用中间类的方法,由中间类来实现怎么调用目标类。
代理模式用这种模式的目的是可以实现client和目标类不直接通信,使他们之间相互独立,这样就比较安全,因为client不知道目标类的存在。
外观模式的目的是通过建立一个中间类,把调用目标类的代码都封装好,例如有时候目标类有很多个,逐一得去调用它们会很麻烦,这样通过中间类封装好的接口,client的调用就好很简单
不适用外观模式的例子
#encoding=utf-8 __author__ = 'kevinlu1010@qq.com' class A(): def run(self): print 'A run' def jump(self): print 'A jump' class B(): def run(self): print 'B run' def jump(self): print 'B jump' class C(): def run(self): print 'C run' def jump(self): print 'C jump' if __name__=='__main__': a=A() b=B() c=C() for item in ('a','b','c'): locals().get(item).run() for item in ('a','b','c'): locals().get(item).jump()
使用外观模式
#encoding=utf-8 __author__ = 'kevinlu1010@qq.com' class A(): def run(self): print 'A run' def jump(self): print 'A jump' class B(): def run(self): print 'B run' def jump(self): print 'B jump' class C(): def run(self): print 'C run' def jump(self): print 'C jump' class Facade(): def __init__(self): self.a=A() self.b=B() self.c=C() def run(self): for item in ('a','b','c'): getattr(self,item).run() def jump(self): for item in ('a','b','c'): getattr(self,item).jump() if __name__=='__main__': facade=Facade() facade.run() facade.jump()