Python设计模式 - 中介者模式

"""

中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,

而且可以独立地改变它们之间的交互。

一般应用于一组对象以定义良好但是复杂的方式进行通信的场合。

优点:降低了各个模块的耦合性。

缺点:中介对象容易变得复杂和庞大。

"""

# -*- coding: utf-8 -*-

import random

import time

class TC:

    def __init__(self):

        self._tm = None

        self._bProblem = 0

    def setup(self):

        print("设置测试")

        time.sleep(0.1)

        self._tm.prepareReporting()

    def execute(self):

        if not self._bProblem:

            print("执行测试")

            time.sleep(0.1)

        else:

            print("问题设置。测试不执行。")

    def tearDown(self):

        if not self._bProblem:

            print("拆除")

            time.sleep(0.1)

            self._tm.publishReport()

        else:

            print("测试不执行。没有拆除需要")

    def setTM(self, tm):

        self._tm = tm

    def setProblem(self, value):

        self._bProblem = value

class Reporter:

    def __init__(self):

        self._tm = None

    def prepare(self):

        print("报表类正准备报告结果")

        time.sleep(0.1)

    def report(self):

        print("报告测试的结果")

        time.sleep(0.1)

    def setTM(self, tm):

        self._tm = tm

class DB:

    def __init__(self):

        self._tm = None

    def insert(self):

        print("增加执行开始状态在数据库")

        time.sleep(0.1)

        # 下面的代码是模拟从DB到TC通信

        if random.randrange(1, 4) == 3:

            return -1

    def update(self):

        print("更新数据库中的测试结果")

        time.sleep(0.1)

    def setTM(self, tm):

        self._tm = tm

class TestManager:

    def __init__(self):

        self._reporter = None

        self._db = None

        self._tc = None

    def prepareReporting(self):

        rvalue = self._db.insert()

        if rvalue == -1:

            self._tc.setProblem(1)

            self._reporter.prepare()

    def setReporter(self, reporter):

        self._reporter = reporter

    def setDB(self, db):

        self._db = db

    def publishReport(self):

        self._db.update()

        self._reporter.report()

    def setTC(self, tc):

        self._tc = tc

if __name__ == '__main__':

    reporter = Reporter()

    db = DB()

    tm = TestManager()

    tm.setReporter(reporter)

    tm.setDB(db)

    reporter.setTM(tm)

    db.setTM(tm)

    #为了简化,我们在相同的测试循环。

    #实际上,它可能是有关各种独特的测试类和它们的对象

    for i in range(3):

        tc = TC()

        tc.setTM(tm)

        tm.setTC(tc)

        tc.setup()

        tc.execute()

        tc.tearDown()

你可能感兴趣的:(Python设计模式 - 中介者模式)