设计模式【十三】:责任链模式

设计模式【十三】:责任链模式

伪代码

typedef int Topic;
const Topic NO_HELP_TOPIC = -1;

class HelpHandler{
public:
	HelpHandler(HelpHandler* h = 0, Topic t = NO_HELP_TOPIC){
		_successor = h;
		_topic = t;
	}
	virtual bool HasHelp(){
		return _topic != NO_HELP_TOPIC;
	}
	virtual void SetHandler(HelpHandler*, Topic);
	virtual void HandleHelp(){
		if(_successor != 0){
			_successor->HandleHelp();
		}
	}
private:
	HelpHandler* _successor;
	Topic _topic;
}

class Widget: public HelpHandler{
protected:
	Widget(Widget* parent, Topic t = NO_HELP_TOPIC){
		HelpHandler(parent, t);
		_parent = parent;
	}
private:
	Widget* _parent;
}

class Button: public Widget{
public:
	Button(Widget* d, Topic t = NO_HELP_TOPIC):Widget(d, t){}
	void HandleHelp(){
		if(HasHelp()){
			// do something   
		}
		else{
			HelpHandler::HandleHelp();
		}
	}
}

优缺点

优点

  • 降低耦合度。责任链中的一环并不知道它的上一级或者下一级是谁:它只知道上一级没有处理请求,所以它需要检查自己是否能处理请求;如果能则不传递给下级,否则将请求传递给下级。
  • 提高给对象安排职责的灵活性。可以在运行时增删改责任链,就和改链表一样。

缺点

  • 责任链中的请求不能确保被处理。因为责任链中的每一环都是动态的,我们不能保证在责任链末端有一个默认的处理者。

何时使用

  • 一个请求需要被多个对象处理,且处理者并不被请求者先验地知道,而是需要运行时动态处理。
  • 多个对象中的一个需要处理请求,但没有一个指定的隐式处理者。
  • 希望动态调整众多处理者的处理优先级。

实现时技巧

  • 责任链的维护和链表类似,具体注意事项和链表相似,指针加点小心。
  • 请求的表示。请求在责任链上传递,那么传递何种信号呢?可以采用方法调用这样的“硬编码”,或传递一个请求码(字符串或int)。

你可能感兴趣的:(设计模式,设计模式,责任链模式)