zoukankan      html  css  js  c++  java
  • 【编程思想】【设计模式】【结构模式Structural】门面模式/外观模式Facade

    Python版

    https://github.com/faif/python-patterns/blob/master/structural/facade.py

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    """
    *What is this pattern about?
    The Facade pattern is a way to provide a simpler unified interface to
    a more complex system. It provides an easier way to access functions
    of the underlying system by providing a single entry point.
    This kind of abstraction is seen in many real life situations. For
    example, we can turn on a computer by just pressing a button, but in
    fact there are many procedures and operations done when that happens
    (e.g., loading programs from disk to memory). In this case, the button
    serves as an unified interface to all the underlying procedures to
    turn on a computer.
    
    *What does this example do?
    The code defines three classes (TC1, TC2, TC3) that represent complex
    parts to be tested. Instead of testing each class separately, the
    TestRunner class acts as the facade to run all tests with only one
    call to the method runAll. By doing that, the client part only needs
    to instantiate the class TestRunner and call the runAll method.
    As seen in the example, the interface provided by the Facade pattern
    is independent from the underlying implementation. Since the client
    just calls the runAll method, we can modify the classes TC1, TC2 or
    TC3 without impact on the way the client uses the system.
    
    *Where is the pattern used practically?
    This pattern can be seen in the Python standard library when we use
    the isdir function. Although a user simply uses this function to know
    whether a path refers to a directory, the system makes a few
    operations and calls other modules (e.g., os.stat) to give the result.
    
    *References:
    https://sourcemaking.com/design_patterns/facade
    https://fkromer.github.io/python-pattern-references/design/#facade
    http://python-3-patterns-idioms-test.readthedocs.io/en/latest/ChangeInterface.html#facade
    
    *TL;DR80
    Provides a simpler unified interface to a complex system.
    """
    
    from __future__ import print_function
    import time
    
    SLEEP = 0.1
    
    
    # Complex Parts
    class TC1:
    
        def run(self):
            print(u"###### In Test 1 ######")
            time.sleep(SLEEP)
            print(u"Setting up")
            time.sleep(SLEEP)
            print(u"Running test")
            time.sleep(SLEEP)
            print(u"Tearing down")
            time.sleep(SLEEP)
            print(u"Test Finished
    ")
    
    
    class TC2:
    
        def run(self):
            print(u"###### In Test 2 ######")
            time.sleep(SLEEP)
            print(u"Setting up")
            time.sleep(SLEEP)
            print(u"Running test")
            time.sleep(SLEEP)
            print(u"Tearing down")
            time.sleep(SLEEP)
            print(u"Test Finished
    ")
    
    
    class TC3:
    
        def run(self):
            print(u"###### In Test 3 ######")
            time.sleep(SLEEP)
            print(u"Setting up")
            time.sleep(SLEEP)
            print(u"Running test")
            time.sleep(SLEEP)
            print(u"Tearing down")
            time.sleep(SLEEP)
            print(u"Test Finished
    ")
    
    
    # Facade
    class TestRunner:
    
        def __init__(self):
            self.tc1 = TC1()
            self.tc2 = TC2()
            self.tc3 = TC3()
            self.tests = [self.tc1, self.tc2, self.tc3]
    
        def runAll(self):
            [i.run() for i in self.tests]
    
    
    # Client
    if __name__ == '__main__':
        testrunner = TestRunner()
        testrunner.runAll()
    
    ### OUTPUT ###
    # ###### In Test 1 ######
    # Setting up
    # Running test
    # Tearing down
    # Test Finished
    #
    # ###### In Test 2 ######
    # Setting up
    # Running test
    # Tearing down
    # Test Finished
    #
    # ###### In Test 3 ######
    # Setting up
    # Running test
    # Tearing down
    # Test Finished
    #
    Python转载版
  • 相关阅读:
    Jmeter 指令记录
    做100个用户的并发测试时是不是得要100个用户的账号呀?
    以后可能会遇到的问题记录 .send_keys 无法输入的情况
    Appscan安装问题记录 + 最后问题解决的方法 和安装步骤
    fiddler工具能干啥
    Appscan_web安全测试工具 (含修改启动浏览器的方法)
    解决需要断言多个,其中有断言错误还要继续往下断言其他的方法
    (unittest之装饰器(@classmethod)) 让多个测试用例在一个浏览器里面跑 的方法
    unittest笔记
    另外一种结尾展示方法
  • 原文地址:https://www.cnblogs.com/demonzk/p/9035434.html
Copyright © 2011-2022 走看看