设计模式之中介者模式

# -*- 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()


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值