zoukankan      html  css  js  c++  java
  • [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对象交互。
  • 相关阅读:
    excel数据导入mySql数据库
    springboot-devtools实现项目的自动重启
    Java中List, Integer[], int[]的相互转换
    Postman代码测试工具如何用?
    git提交代码时,Unstaged changes如何过滤.class .log等文件
    Json字符串转map集合
    实现hibernate 的validator校验
    [转载]OpenSSL中文手册之命令行详解(未完待续)
    Openssl ASN.1 说明一 分享
    [转载]Parsing X.509 Certificates with OpenSSL and C
  • 原文地址:https://www.cnblogs.com/CheeseZH/p/9431338.html
Copyright © 2011-2022 走看看