# -*- coding: gbk -*-
# -*- coding: utf-8 -*-
"""
这是中介者模式的一个应用场景。(参考了《设计模式之禅》)
·中介者模式中每个模块只负责自己的业务逻辑,不属于自己的则丢给中介者来处理。(迪米特
原则,单一职责原则,开闭原则)。
·此模式的缺点也很明显,那就是中介者类过于臃肿。
"""
class AbsMediator(object):
#中介部门,沟通采购、销售、库存部门
def __init__(self, purchase, stock, sale):
self.purchase = purchase
self.stock = stock
self.sale = sale
def execute(self):
pass
class Mediator(AbsMediator):
def __init__(self, purchase, stock, sale):
super(Mediator, self).__init__(purchase, stock, sale)
self.purchase.setMediator(self)
self.stock.setMediator(self)
self.sale.setMediator(self)
def execute(self, command, *args, **kwargs):
#按函数名执行函数
self.__class__.__dict__[command](self, *args, **kwargs)
def buyComputer(self,number):
#这里包含了多个部门的业务逻辑,不建议放在单一部门类中,而应该放到中介类中,下同
saleStatus = self.sale.getSaleStatus()
#根据销售情况决定采购量
if(saleStatus):
print '采购%d台电脑' % number
else:
number = number/2.0
print '采购%d台电脑' % number
self.stock.increase(number)
def sellComputer(self, number):
if(self.stock.getStockNumber() < number):
print '电脑数量不足,请通知采购部门采购。'
self.purchase.buyComputer(number)
self.stock.decrease(number)
def offSale(self):
print '打折销售%d台电脑' % self.stock.getStockNumber()
def clearStock(self):
self.purchase.refuseBuyComputer()
self.sale.offSale()
class AbsDepartment(object):
#每个部门类只需要知道中介者类即可,避免了和其他部门类的耦合。同时,各个部门类只负责
#属于自己的业务逻辑,与其他部门的交互则交给中介者类,保证了类职责的单一。
def __init__(self):
pass
def setMediator(self, mediator):
self.mediator = mediator
class Purchase(AbsDepartment):
def buyComputer(self, number):
#采购部门执行采购电脑的行为,至于与其他部门的交互,则由中介者类处理
self.mediator.execute('buyComputer', number)
def refuseBuyComputer(self):
print '暂停采购电脑'
class Stock(AbsDepartment):
def __init__(self):
self.computerNum = 0
def setComputerNum(self, number):
self.computerNum = number
def increase(self, number):
self.computerNum += number
def decrease(self, number):
self.computerNum -= number
def getStockNumber(self):
return self.computerNum
def clearStock(self):
print '库存压力大,销售人员想办法清空库存。'
self.mediator.execute('clearStock')
class Sale(AbsDepartment):
def sellComputer(self, number):
print '销售了%d台电脑' % number
self.mediator.execute('sellComputer', number)
def getSaleStatus(self):
#默认销售情况很好
return True
def offSale(self):
self.mediator.execute('offSale')
if __name__ == '__main__':
purchaseDepart = Purchase()
stockDepart = Stock()
saleDepart = Sale()
mediator = Mediator(purchaseDepart, stockDepart, saleDepart)
#各个部门类只需要完成自己的业务,至于其他部门需要怎么配合,则由中介者类调度。
purchaseDepart.buyComputer(250)
saleDepart.sellComputer(300)
stockDepart.clearStock()
设计模式之中介者模式
最新推荐文章于 2021-08-10 19:22:10 发布