欢迎来到天天文库
浏览记录
ID:49222022
大小:133.04 KB
页数:13页
时间:2020-02-02
《对象行为模式(职责链).ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、5.1-Chainofresponsbility(职责链)-对象行为模式定义:将多个对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。它让你通过一条候选对象链隐式的向一个对象发送请求,根据运行时刻情况任一候选者都可以响应相应的要求候选者的数目是任意的,增强了可扩展性。例如:在一个图形界面中,有上下文有关的帮助机制。用户在界面的任一部分上点击就可以得到帮助信息,所提供的帮助依赖于点击的是界面的哪一部分以及其上下文。如果对那一部分界面没有特定的帮助信息,那么帮助系统会显示一个关于当前上下文的较一般的帮助信息,因此应根据普遍性即从最特殊到最普遍的顺序来组织帮助信息。结构图适用性:
2、有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。你想在不明确指定接收者的情况下,向多个对象中的一个提交请求。可处理一个请求的对象集合应被动态指定。参与者:Handler(如:HelpHandler)-定义一个处理请求的接口,实现后继链ConcreteHandler(如:PrintButton和PrintDialog)-处理它所负责的请求;可访问它的后继者;如果可处理该请求,处理之,否则将该请求转发给它的后继者Client-向链上的具体处理者(ConcreteHandler)对象提交请求优点及缺点降低耦合度,该模式使得一个对象无需知道是其他哪一个对象处理其请求,对象仅需要
3、知道该请求会被正确处理。这样接受者和发送者都没有对方的明确信息,且链中的对象不需知道链的结构增强了给对象指派职责的灵活性,你可以通过在运行时刻对该链进行动态的增加或修改来改变处理一个请求的那些职责不保证被接受,一个请求没有明确的接受者,就不能保证它一定会被处理实例:餐馆点餐流程图代码:#include"stdafx.h"#include"customer.h"#include"employee.h"#include"waiter.h"#include"ChefCook.h"#include"assistantCook.h"int_tmain(intargc,_TCHAR*argv[]){
4、CEmployee*waiter=newCWaiter();CEmployee*chefCook=newCChefCook();CEmployee*assistantCook=newCAssistantCook();waiter->setSuccessor(assistantCook);assistantCook->setSuccessor(chefCook);CCustomer*customer=newCCustomer();customer->OrderDish("青椒肉丝",waiter);customer->OrderDish("大盘鸡",waiter);customer->Or
5、derDish("清蒸熊猫",waiter);deletewaiter;deletechefCook;deleteassistantCook;deletecustomer;return0;}#include"stdafx.h"#include"employee.h"voidCEmployee::setSuccessor(CEmployee*successor){this->m_pSuccessor=successor;}voidCEmployee::HandleOrder(char*OrderName){if(m_pSuccessor!=NULL){m_pSuccessor->Handl
6、eOrder(OrderName);}}#include"stdafx.h"#include"customer.h"voidCCustomer::OrderDish(char*DishName,CEmployee*waiter){waiter->HandleOrder(DishName);}#include"stdafx.h"#include"waiter.h"voidCWaiter::HandleOrder(char*OrderName){if(m_pSuccessor){printf("服务员接受顾客的点菜[%s],并把菜单交给了厨房",OrderName);m_pSuccess
7、or->HandleOrder(OrderName);}else{printf("这家餐馆没法提供这道菜[%s]",OrderName);}}#include"stdafx.h"#include"ChefCook.h"#include"string.h"voidCChefCook::HandleOrder(char*OrderName){if(strcmp(OrderName,"大盘鸡")==0){printf("厨师长接受
此文档下载收益归作者所有