zoukankan      html  css  js  c++  java
  • python 设计模式之门面模式

    facade:建筑物的表面
    门面模式是一个软件工程设计模式,主要用于面向对象编程。 一个门面可以看作是为大段代码提供简单接口的对象,就像类库。
     
    门面模式被归入建筑设计模式。门面模式隐藏系统内部的细节和复杂度,给用户提供一个简单的接口,采用门面模式,用户能够使用简单的接口进行工作,而不用担心系统的复杂。
    理解门面模式最重要的一点就是它提供的简单接口是系统的一部分。因此提供简单易用的功能要胜过完整的功能。
     
    门面模式的优点是向用户提供的基础类的操作,在当前门面模式的实现下,是不会向用户提供可控的,定制化的接口。
    基于以上原因,门面模式不是对子系统的封装,而是对可选的功能提供简单的接口
     
    下面是用块图,对门面模式的解释:
    1.在块图表中,我们有将计算机分成三种类来表示:CPU,Memory,HardDrive。
    cpu类有一个方法是jump()和execute(),Memory类有方法,load(),HardDrive类有一个read()方法
     
    2.我们有个一个门面类,Computer Class ,提供start()方法给用户。
     
    3.当用户想要开启电脑系统的时候,它调用Computer类的start()方法.
     
     

    一个简单的python例子:

    让我们来考虑一个测试自动化的框架,测试需要运行在特定构建类上,比如’TC1,TC2…TCn’,每一个类都包涵一个方法’run()’来执行测试。

    我们提供了一个门面-TestRunner-在测试类之上,作为执行测试的简单接口。以这种方式,客户不在需要担心有多少测试在执行,怎么样执行他。

    TestRunner类有一个方法名runAll,是执行已经注册的所有测试。

    当用户的自动框架为执行测试去构建,作为客户,他需要创建一个TestRunner类,调用runall方法,runall方法会返回创建的测试对象,

    并调用他们的run 方法,这样执行了所有测试。

     
     以下是代码:
    import time
    class TC1:
        def run(self):
            print "####In Test 1####"
            time.sleep(1)
            print "Setting up"
            time.sleep(1)
            print "Running test"
            time.sleep(1)
            print "Tearing down"
            time.sleep(1)
            print "Test Finished
    "
    
    class TC2:
        def run(self):
            print "#####In Test 2 ######"
            time.sleep(1)
            print "Setting up"
            time.sleep(1)
            print "Running test"
            time.sleep(1)
            print "Tearing down"
            time.sleep(1)
            print "Test Finished
    "
    
    class TC3:
        def run(self):
            print "#####In Test 3 ######"
            time.sleep(1)
            print "Setting up"
            time.sleep(1)
            print "Running test"
            time.sleep(1)
            print "Tearing down"
            time.sleep(1)
            print "Test Finished
    "
    
    #Facade 
    class TestRunner:
        def __init__(self):
            self.tc1 = TC1()
            self.tc2 = TC2()
            self.tc3 = TC3()
    
        def runAll(self):
            self.tc1.run()
            self.tc2.run()
            self.tc3.run()
    
    #Client
    if __name__ == '__main__':
        testrunner = TestRunner()
        testrunner.runAll()
     
     
     
  • 相关阅读:
    JavaScript 之 typeof
    Octotree Chrome安装与使用方法
    支持主流MySQL中间件的数据迁移工具ora2mysql
    Eclipse搭建SpringBoot之HelloWorld
    Spring Boot插件spring tool suite安装及使用
    树的前中后序遍历非递归实现
    判断是否是完全二叉树
    Leetcode 437_path sum III todo
    DFS回溯只在递归基回溯————leetcode112
    Leetcode 94 Binary Tree Inorder
  • 原文地址:https://www.cnblogs.com/lizhitai/p/4464971.html
Copyright © 2011-2022 走看看