与状态模式相似的设计模式---职责链模式
2015-02-13 10:12
197 查看
今天我们要讨论的设计模式与前面提到的状态模式非常相似,他们不能的地方:状态模式是每个具体的状态处理自己状态的事务,若非自己状态处理的数据则将状态移动到一下一个具体状态类处理;而职责链则是根据自己的职责完成本职工作,若不能完成则判断是否已经关联了下一个环节职责,若存在则调用下一环节的处理。他们两个一个是在具体类中已经设定了下一环节,而另外一个则是在客户端先设定好职责链。
什么是职责链模式?使多个对象(职责对象)都有机会处理请求,从而避免了请求发送者与接收者之间的耦合性。将这职责对象连成一条链,使得传入的参数(指发送者的数据)并沿着链传递请求,直到有一个对象处理它为止。咱们在使用这种模式的时候一定要充分考虑好,否则会出现发出去的请求而没有一个职责对象处理。
抽象类(Handler)定义了如何设定职责链下一环节对象,抽象处理方法:
abstract class Handler
{
protected Handler handler;
//此方法的目的是设定后续的职责对象
public void SetSuccessor(Handler handler)
{
this.handler=handler;
}
//处理请求的抽象方法:后续继承类中具体实现处理,如处理不了则转到后续职责handler对象处理
public abstract void HandlerRequest(int Request);
}
具体的职责类就简单了,只需重写自己的处理方式,如果处理不了则转到下一个职责链对象处理(已经设定的handler对象):
class ConcreteHandler1:Handler
{
public override void HandlerRequest(int Request)
{
if(Request>0 && Request<=10)
{
Console.WriteLine("处理本职工作1");
}
else
{
//已经设定后续的职责对象,并移交处理
if(handler!=null)
{
handler.HandlerRequest(Request);
}
}
}
}
class ConcreteHandler2:Handler
{
public override void HandlerRequest(int Request)
{
if(Request>10 && Request<=20)
{
Console.WriteLine("处理本职工作2");
}
else
{
//已经设定后续的职责对象,并移交处理
if(handler!=null)
{
handler.HandlerRequest(Request);
}
}
}
}
class ConcreteHandler3:Handler
{
public override void HandlerRequest(int Request)
{
if(Request>20 && Request<=30)
{
Console.WriteLine("处理本职工作3");
}
else
{
//已经设定后续的职责对象,并移交处理
if(handler!=null)
{
handler.HandlerRequest(Request);
}
}
}
}
客户端代码,首先我们需要创建个职责链对象,并把所有的职责链对象串起来;每个处理请求的时候都从第一个职责对象开始就OK了:
//客户端代码
static void Main(string[] arg)
{
Handler h1=new ConcreteHandler1();
Handler h2=new ConcreteHandler2();
Handler h3=new ConcreteHandler3();
h1.SetSuccessor(h2);
h2.SetSuccessor(h3);
int[] request={2,8,12,16,23,29,30};
foreach(int tmp in reguest)
{
h1.HandlerRequest(tmp);
}
}
这个设计模式的好处:减少我们各职责之间的耦合性,仅需设定处理不了时下一职责对象就好了。如果我们还需要进行添加职责,只需在重新继承基类重写一个具体职责类;易操作、不修改原来已写好的代码,实现了开放--闭合的设计原则。
什么是职责链模式?使多个对象(职责对象)都有机会处理请求,从而避免了请求发送者与接收者之间的耦合性。将这职责对象连成一条链,使得传入的参数(指发送者的数据)并沿着链传递请求,直到有一个对象处理它为止。咱们在使用这种模式的时候一定要充分考虑好,否则会出现发出去的请求而没有一个职责对象处理。
抽象类(Handler)定义了如何设定职责链下一环节对象,抽象处理方法:
abstract class Handler
{
protected Handler handler;
//此方法的目的是设定后续的职责对象
public void SetSuccessor(Handler handler)
{
this.handler=handler;
}
//处理请求的抽象方法:后续继承类中具体实现处理,如处理不了则转到后续职责handler对象处理
public abstract void HandlerRequest(int Request);
}
具体的职责类就简单了,只需重写自己的处理方式,如果处理不了则转到下一个职责链对象处理(已经设定的handler对象):
class ConcreteHandler1:Handler
{
public override void HandlerRequest(int Request)
{
if(Request>0 && Request<=10)
{
Console.WriteLine("处理本职工作1");
}
else
{
//已经设定后续的职责对象,并移交处理
if(handler!=null)
{
handler.HandlerRequest(Request);
}
}
}
}
class ConcreteHandler2:Handler
{
public override void HandlerRequest(int Request)
{
if(Request>10 && Request<=20)
{
Console.WriteLine("处理本职工作2");
}
else
{
//已经设定后续的职责对象,并移交处理
if(handler!=null)
{
handler.HandlerRequest(Request);
}
}
}
}
class ConcreteHandler3:Handler
{
public override void HandlerRequest(int Request)
{
if(Request>20 && Request<=30)
{
Console.WriteLine("处理本职工作3");
}
else
{
//已经设定后续的职责对象,并移交处理
if(handler!=null)
{
handler.HandlerRequest(Request);
}
}
}
}
客户端代码,首先我们需要创建个职责链对象,并把所有的职责链对象串起来;每个处理请求的时候都从第一个职责对象开始就OK了:
//客户端代码
static void Main(string[] arg)
{
Handler h1=new ConcreteHandler1();
Handler h2=new ConcreteHandler2();
Handler h3=new ConcreteHandler3();
h1.SetSuccessor(h2);
h2.SetSuccessor(h3);
int[] request={2,8,12,16,23,29,30};
foreach(int tmp in reguest)
{
h1.HandlerRequest(tmp);
}
}
这个设计模式的好处:减少我们各职责之间的耦合性,仅需设定处理不了时下一职责对象就好了。如果我们还需要进行添加职责,只需在重新继承基类重写一个具体职责类;易操作、不修改原来已写好的代码,实现了开放--闭合的设计原则。
相关文章推荐
- 设计模式 - 状态模式、职责链模式
- TypeScript设计模式之职责链、状态
- TypeScript设计模式之职责链、状态
- 设计模式 - 状态模式、职责连模式
- 解读设计模式--单一职责原则
- 每天一设计模式之 职责链模式
- C++ 设计模式之状态模式的使用
- Android中设计模式--状态模式(将动作委托到当前状态,状态之间可以互相转换)
- 设计模式之状态模式(State)
- 设计模式笔记(20)---职责链模式(行为型)
- Java设计模式之责任链模式、职责链模式
- Java设计模式-21-单一职责原则
- 设计模式--状态模式
- 设计模式中遵循的原则:单一职责、开发-封闭、依赖倒转
- 设计模式之Chain of Responsibility(职责链)
- 设计模式---->单一职责原则
- 【设计模式】加薪非要老总批 --- 职责链模式
- State模式(状态设计模式)
- 嵌入式设计模式:有限状态自动机的C语言实现
- 设计模式之状态模式(State)