简介
外观模式为子系统中的一组接口提供了一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式通过引入一个外观类,由外观类分别调用内部的多个模块来实现功能,从而客户端只需要和外观类交互就可以。
外观模式的目的不是给子系统添加新的功能接口,而是包装已有的功能,为了让外部减少与子系统多个模块的交互,松散耦合。
外观模式的本质就是封装交互,简化调用。
示例
股民炒股代码
class Stock1:
def Sell(self):
print "Stock 1 sell."
def Buy(self):
print "Stock 1 buy."
class Stock2:
def Sell(self):
print "Stock 2 sell."
def Buy(self):
print "Stock 2 buy."
class Stock3:
def Sell(self):
print "Stock 3 sell."
def Buy(self):
print "Stock 3 buy."
class NationalDebt1:
def Sell(self):
print "NationalDebt 1 sell."
def Buy(self):
print "NationalDebt 1 buy."
class Realty1:
def Sell(self):
print "Realty 1 sell."
def Buy(self):
print "Realty 1 buy."
if __name__ == "__main__":
gu1 = Stock1()
gu2 = Stock2()
gu3 = Stock3()
nd1 = NationalDebt1()
rt1 = Realty1()
gu1.Buy()
gu2.Buy()
gu3.Buy()
nd1.Sell()
rt1.Sell()
投资基金代码
class Fund:
gu1 = None
gu1 = None
gu1 = None
nd1 = None
rt1 = None
def __init__(self):
gu1 = Stock1()
gu2 = Stock2()
gu3 = Stock3()
nd1 = NationalDebt1()
rt1 = Realty1()
def BuyFund():
gu1.Buy()
gu2.Buy()
gu3.Buy()
nd1.Buy()
rt1.Buy()
def SellFund():
gu1.Sell()
gu2.Sell()
gu3.Sell()
nd1.Sell()
rt1.Sell()
if __name__ == "__main__":
jijin = Fund()
jijin.BuyFund()
jijin.SellFund()
class SubSystemOne:
def MethodOne(self):
print "SubSystem one"
class SubSystemTwo:
def MethodTwo(self):
print "SubSystem Two"
class SubSystemThree:
def MethodThree(self):
print "SubSystem Three"
class SubSystemFour:
def MethodFour(self):
print "SubSystem Four"
class Facade:
one = None
two = None
three = None
four = None
def __init__(self):
self.one = SubSystemOne()
self.two = SubSystemTwo()
self.three = SubSystemThree()
self.four = SubSystemFour()
def MethodA(self):
print "MethodA() ------- "
one.MethodOne()
two.MethodTwo()
four.MethodFour()
def MethodB(self):
print "MethodB() ------- "
two.MethodTwo()
three.MethodThree()
if __name__ == "__main__":
facade = Facade()
facade.MethodA()
facade.MethodB()
外观模式的优缺点
优点:
- 松散耦合-----松散了客户端与子系统的耦合关系,让子系统内部的模块能更加容易的扩展和维护
- 简单易用-----无需了解子系统内部的实现
- 更好的划分访问的层次------把需要暴露给外部的功能集中到外观中,隐藏内部的细节
- 过多的或者不合理的facade容易让人迷惑。到底是调用外观好还是直接调用模块好?
外观模式在什么时候使用最好?
1. 在设计初期,就要将数层之间分离,层之间建立外观。
2. 在开发阶段,子系统因为演进变得越来越复杂
3. 在后期维护阶段,代码思路清晰,比较容易维护。
相关模式
- 外观模式和中介者模式
在中介者模式的实现里面,需要实现具体的交互功能;而外观模式本身并不实现任何功能,只是组合调用。
中介者模式的目的主要是松散多个模块之间的耦合,把这些耦合关系全部放在中介者中实现。而外观模式主要是简化客户端的调用。