[Python设计模式] 第12章 基金理财更省事——外观模式

github地址:https://github.com/cheesezh/python_design_patterns

题目1

用程序模拟股民直接炒股的代码,比如股民投资了股票1,股票2,股票3,国债1,房地产1.

class Stock1():
    def sell(self):
        print("卖出股票1")
    def buy(self):
        print("买入股票1")
        
class Stock2():
    def sell(self):
        print("卖出股票2")
    def buy(self):
        print("买入股票2")
        
class Stock3():
    def sell(self):
        print("卖出股票3")
    def buy(self):
        print("买入股票3")
        
class NationalDebt1():
    def sell(self):
        print("卖出国债1")
    def buy(self):
        print("买入国债1")
        
class Realty1():
    def sell(self):
        print("卖出房地产1")
    def buy(self):
        print("买入房地产1")
        
def user_action():
    """
    模拟股民的操作,股民需要了解各个理财产品的走势,进而买入卖出
    """
    gu1 = Stock1()
    gu2 = Stock2()
    gu3 = Stock3()
    nd1 = NationalDebt1()
    rt1 = Realty1()
    
    gu1.buy()
    gu2.buy()
    gu3.buy()
    nd1.buy()
    rt1.buy()
    
    gu1.sell()
    gu2.sell()
    gu3.sell()
    nd1.sell()
    rt1.sell()
    
user_action()
买入股票1
买入股票2
买入股票3
买入国债1
买入房地产1
卖出股票1
卖出股票2
卖出股票3
卖出国债1
卖出房地产1

题目2

用程序模拟股民通过基金理财的代码,股民只需要购买&卖出基金即可,不需要对具体的股票等有了解.

class Fund():
    def __init__(self):
        self.gu1 = Stock1()
        self.gu2 = Stock2()
        self.gu3 = Stock3()
        self.nd1 = NationalDebt1()
        self.rt1 = Realty1()
        
    def sell(self):
        self.gu1.sell()
        self.gu2.sell()
        self.gu3.sell()
        self.nd1.sell()
        self.rt1.sell()
    
    def buy(self):
        self.gu1.buy()
        self.gu2.buy()
        self.gu3.buy()
        self.nd1.buy()
        self.rt1.buy()
        
def user_action():
    """
    模拟股民的操作,股民只需要买进卖出基金即可
    """
    fund = Fund()
    
    fund.buy()
    
    fund.sell()
    
user_action()
买入股票1
买入股票2
买入股票3
买入国债1
买入房地产1
卖出股票1
卖出股票2
卖出股票3
卖出国债1
卖出房地产1

外观模式

外观模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用[DP]。

多个子系统类

class SubSystemOne():
    def method_one(self):
        print("子系统方法1")
        
class SubSystemTwo():
    def method_two(self):
        print("子系统方法2")
        
class SubSystemThree():
    def method_three(self):
        print("子系统方法3")

外观类

class Facade():
    def __init__(self):
        self.one = SubSystemOne()
        self.two = SubSystemTwo()
        self.three = SubSystemThree()
        
    def method_a(self):
        self.one.method_one()
        self.two.method_two()
        
    def method_b(self):
        self.two.method_two()
        self.three.method_three()

def main():
    facade = Facade()
    
    facade.method_a()
    
    facade.method_b()
    
main()
子系统方法1
子系统方法2
子系统方法2
子系统方法3

点评

外观模式完美的体现了依赖倒转原则和迪米特法则的思想,是非常常用的模式之一。

那么什么时候使用外观模式最好?

  • 在设计阶段,应该有意识的将不同的两个层分离,比如经典的三层架构,需要考虑在数据访问层和业务逻辑层,业务逻辑层和表示层的层与层之间简历外观模式,这样可以为复杂的子系统提供一个简单的接口,使得耦合度降低;
  • 在开发阶段,子系统往往因为不断重构演化而变得越来越复杂,大多数的模式使用时也都会产生很多很小的类,这本是好事,但是也给外部调用它们的用户程序带来了使用上的困难,增加外观Facade可以提供一个简单的接口,减少它们之间的依赖;
  • 在维护阶段,可能一个大型的系统已经非常难以维护和扩展,但是因为它包含了重要功能,新的开发需求必须依赖它,此时也可以使用外观模式。可以为新系统开发一个Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统和Facade对象交互。
posted @ 2018-08-06 17:08  ZH奶酪  阅读(365)  评论(0编辑  收藏  举报