视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python使用设计模式中的责任链模式与迭代器模式的示例
2020-11-27 14:35:36 责编:小采
文档
责任链模式

责任链模式:将能处理请求的对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理请求为止,避免请求的发送者和接收者之间的耦合关系。

#encoding=utf-8 
# 
#by panda 
#职责连模式 
 
def printInfo(info): 
 print unicode(info, 'utf-8').encode('gbk') 
 
#抽象职责类 
class Manager(): 
 successor = None 
 name = '' 
 def __init__(self, name): 
 self.name = name 
 
 def SetSuccessor(self, successor): 
 self.successor = successor 
 
 def HandleRequest(self, request): 
 pass 
 
#具体职责类:经理 
class CommonManager(Manager): 
 def HandleRequest(self, request): 
 if request.RequestType == '请假' and request.Number <= 2: 
 printInfo('%s:%s 数量%d 被批准' % (self.name, request.RequestContent, request.Number)) 
 else: 
 if self.successor != None: 
 self.successor.HandleRequest(request) 
 
#具体职责类:总监 
class Majordomo(Manager): 
 def HandleRequest(self, request): 
 if request.RequestType == '请假' and request.Number <= 5: 
 printInfo('%s:%s 数量%d 被批准' % (self.name, request.RequestContent, request.Number)) 
 else: 
 if self.successor != None: 
 self.successor.HandleRequest(request) 
 
#具体职责类:总经理 
class GeneralManager(Manager): 
 def HandleRequest(self, request): 
 if request.RequestType == '请假': 
 printInfo('%s:%s 数量%d 被批准' % (self.name, request.RequestContent, request.Number)) 
 elif request.RequestType == '加薪' and request.Number <= 500: 
 printInfo('%s:%s 数量%d 被批准' % (self.name, request.RequestContent, request.Number)) 
 elif request.RequestType == '加薪' and request.Number > 500: 
 printInfo('%s:%s 数量%d 再说吧' % (self.name, request.RequestContent, request.Number)) 
 
class Request(): 
 RequestType = '' 
 RequestContent = '' 
 Number = 0 
 
def clientUI(): 
 jinLi = CommonManager('金力') 
 zongJian = Majordomo('宗健') 
 zhongJingLi = GeneralManager('钟金利') 
 
 jinLi.SetSuccessor(zongJian) 
 zongJian.SetSuccessor(zhongJingLi) 
 
 request = Request() 
 request.RequestType = '请假' 
 request.RequestContent = '小菜请假' 
 request.Number = 1 
 jinLi.HandleRequest(request) 
 
 request.RequestType = '请假' 
 request.RequestContent = '小菜请假' 
 request.Number = 5 
 jinLi.HandleRequest(request) 
 
 request.RequestType = '加薪' 
 request.RequestContent = '小菜要求加薪' 
 request.Number = 500 
 jinLi.HandleRequest(request) 
 
 request.RequestType = '加薪' 
 request.RequestContent = '小菜要求加薪' 
 request.Number = 1000 
 jinLi.HandleRequest(request) 
 return 
 
if __name__ == '__main__': 
 clientUI(); 

类图:

迭代器模式
迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。

python内置支持这种模式,所以一般来说,不用自己写,

#encoding=utf-8 
# 
#by panda 
#迭代器(Iterator)模式 
 
def printInfo(info): 
 print unicode(info, 'utf-8').encode('gbk') 
 
#迭代器抽象类 
class Iterator: 
 def First(self): 
 pass 
 
 def Next(self): 
 pass 
 
 def IsDone(self): 
 pass 
 
 def CurrentItem(self): 
 pass 
 
#集合抽象类 
class Aggregate: 
 def CreateIterator(self): 
 pass 
 
#具体迭代器类: 
class ConcreteIterator(Iterator): 
 aggregate = None 
 current = 0 
 def __init__(self, aggregate): 
 self.aggregate = aggregate 
 self.current = 0 
 
 def First(self): 
 return self.aggregate[0] 
 
 def Next(self): 
 ret = None 
 self.current += 1 
 if(self.current < len(self.aggregate)): 
 ret = self.aggregate[self.current] 
 return ret 
 
 def IsDone(self): 
 if(self.current < len(self.aggregate)): 
 return False 
 else: 
 return True 
 
 def CurrentItem(self): 
 ret = None 
 if(self.current < len(self.aggregate)): 
 ret = self.aggregate[self.current] 
 return ret 
 
#具体集合类 
class ConcreteAggregate(Aggregate): 
 items = None 
 def __init__(self): 
 self.items = [] 
 
def clientUI(): 
 a = ConcreteAggregate() 
 a.items.append('大鸟') 
 a.items.append('小菜') 
 a.items.append('行李') 
 a.items.append('老外') 
 a.items.append('公交内部员工') 
 a.items.append('小偷') 
 
 
 printInfo('---------迭代器模式-------------') 
 i = ConcreteIterator(a.items) 
 item = i.First() 
 while(False == i.IsDone()): 
 printInfo("%s 请买车票!" % i.CurrentItem()); 
 i.Next() 
 
 printInfo('
---------python内部迭代-------------') 
 for item in a.items: 
 printInfo("%s 请买车票!" % item); 
 return 
 
if __name__ == '__main__': 
 clientUI(); 

类图:

下载本文
显示全文
专题