菜菜又开始写设计模式的文章啦,今天和大家谈谈本人对职责链模式与命令模式的理解,并给出简易的demo(demo涉及到到菜菜,猫猫,涛涛,望见谅)。
为什么需要把这两个模式放在一起写呢,其实只是菜菜在学习这两个模式的时候,对于思想上的理解有些混淆而已,不过他们两者还是有一定关联的:
1.RC(Responsibility Chain)与Command模式都属于设计模式中的行为模式,所谓行为模式,即要描述对象或类的模式,而且要描述对象间的通讯模式
2.职责链模式使一个特定的请求接收对象对请求或命令的执行变得不确定,松耦合,而命令模式使得一个特定的对象与一个命令的执行变得明显和确定。 在Java中,异常捕获(try catch字句),就是用了职责链模式;而SWT的事件驱动机制则很好的运用了命令模式(菜菜的demo中也会设计到回调的实现)
好了,边上代码边和大家一起学习
职责链模式:
涛涛经常在群里面问问题,假设,群里面就我和猫负责回答问题(当然,我们的群大家都很活跃),而且我一般只知道java方面的知识,猫比较精通.net。 于是乎,涛涛每次在群里面问问题的时候,都会标注是问题类型,问题内容(如:Java,java是什么?)。问题提出后,涛并不知道谁会回答,但是只要是符合我和猫胃口的,他总能得到满意答案。 于是乎,菜菜,猫,涛三人之间的职责链模式开始了
- public class ProgramRequest {
- public static final int DOTNET_QUESTION = 1;
- public static final int JAVA_QUESTION = 2;
- private int m_questionType;
- private String m_content;
- public ProgramRequest(int type,String message){
- this.m_questionType = type ;
- this.m_content = message;
- }
- public int getType(){
- return m_questionType;
- }
- public String getContent(){
- return m_content;
- }
- }
以上代码只是个负责标志涛涛提问请求的一个功能类,类似与javabean的功能,这里只做演示,所以属性较少。不多做解释。
- public abstract class IProgramHandler {
- protected String m_name;
- protected IProgramHandler m_nextHandler;
- public IProgramHandler(String name){
- this.m_name = name ;
- }
- public String getName(){
- return m_name;
- }
- public void setNextHandler(IProgramHandler handler){
- this.m_nextHandler = handler;
- }
- public IProgramHandler getNextHandler(){
- return m_nextHandler;
- }
- public abstract void Handler(ProgramRequest request);
- }
以上代码是一个负责处理请求的接口,这里,菜菜用了抽象类来实现,各位也可以用Interface。 需要解释的是,该类里面有实际方法也有抽象方法,实际方法中getNextHandler是负责传递下一个任务处理者。 而handler这个抽象方法,就是菜菜和猫这两个类去负责实现。
菜菜处理类: