`
chendw_hz
  • 浏览: 10687 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

责任链模式

 
阅读更多

责任链模式是一种行为模式。多个处理类组成一个责任链,责任链处理同一个请求,如果处理类不处理就传递给下一个处理类来处理,每个处理类保持对下一个处理类的引用,直到遍历完所有链类直到有类来处理为止。

纯的责任链有两种行为:要么处理掉,要么不处理掉。

不纯责任链:处理器只处理其中一部分请求逻辑,责任链中所有处理器类可以不处理请求。

 

这里以 病人看病。刚好 脚受伤。。不知道找哪个科室。分别找内科。外科。。皮肤科 最后找到了骨科。到了。骨科医生再也没推辞了。二话不说就给他处理掉了。。

每个科室的医生都各自负责自己分内的事。所有这些科室组织成一个责任链。然后分别找这些科室。。找对了科室就会处理掉。。这个是典型的责任链模式的应用

//病人统一接口。有可能腿上。。有可能是皮肤病等。 

public interface Patient{

    //出问题的方法 譬如皮肤出问题。骨折等。

    public void fractrue();

}

 

//病人的实现接口的类

pulic class PatientImpl implements Patient{

     //什么病  属性

    private String  problem;

   

    //构造子

    public PatientImpl(String problem){

 

     this.prodblem = problem;

 }

 

 public void fractrue(){

    System.out.println("我是生的病是"+problem+",请医生帮我看一下!谢谢");

 }

 

   public void setProblem(String problem){

      this.problem=problem

   }

   

   public void getProblem(String problem){

     return problem;

   }

}

 

//不同医生 看不同的病 组成一个责任链换

 public inteface DoctorHandler{

    //处理器是否已经处理了这个病人

     public void handle(Patient patient);

 }

 

//内科医生处理器

public class PhysicianHandler  implements DoctorHandler{

   //下一个处理器的引用

   private  DoctorHandler handler;

    //具体处理器类  

    public void handle(Patient patient){

           if(StringUtils.equals(patient.getProblem,"心脏病")){

                patient.fractrue();

               System.out.println("你这个心脏病很严重啊,我给看看,开几副药吃吃看!");

          }else{

                //丢给下一个处理器

                handler.handle(patient); 

               }   

     }

 

  public void setHandler(DoctorHandler handler){

       this.handler = handler

    }

}

 

//外科医生处理,处理大部分外科病

public class SurgeonHandler implements DoctorHandler{

     //保持下一个处理器的引用

   private DoctorHandler handler;

    //外科处理

    public void handle(Patient patient){

       if(StringUtils.equals(patient,"皮肤病")){

              patient.fractrue();

             System.out.println("你这个病很严重,给你开几副药吧。。不然会毁容!");

       }else{

            //丢给下一个处理器

               handler.handle(patient);

          }

   }

 

  public void setHandler(DoctorHandler handler){

       this.handler = handler

    }

}

 

//骨科医生的处理器。

public void OrthopaedicsHandler implements DoctorHandler{

    //下一个处理器

   private DoctorHandler handler;

   

    //骨科处理骨科病的方式 

    public void handle(Patient patient){

      if(StringUtils.equals(patient.getProblem,"骨折")){

          patient.fractrue();

         System.out.println("骨折不是很严重,打一下石膏,过三天就好了!")  

     }else{

              handler.handle(patient);

            }

    }

  

  public void setHandler(DoctorHandler handler){

       this.handler = handler

    }

 }

 

//客户端创建病人。。然后丢给医院的各个科室,让科室医生去看,病人不知道哪个科室能处理哪种病

public class Client{

  

 public static void main(String args[]){

       //骨折病人

        Patient patient = new PatientImpl("骨折");

        DoctorHandler handler = new PhysicianHandler()

        DoctorHandler handler1 = new SurgeonHandler();

        DoctorHandler handler2= new OrthopaedicsHandler();

        handler.setHandler(handler1);

        handler1.setHandler(handler2);

        handler.handle(patient);

  }

}

//打印结果

我是生的病是骨折,请医生帮我看一下!谢谢;

骨折不是很严重,打一下石膏,过三天就好了!;

当创建骨折病人请求时,在骨折医生这里得到了救治和处理。其他医生是不会处理点,然后丢给其他科室医生进行处理。

这个例子虽然很粗略,但是说明责任链模式的意图和用意。

责任链模式的核心:

多个处理器类组成一个环型结构。

使用场景:

1:系统发出一个请求,给多个处理器对象处理这一个请求。但是不会知道到底由哪个处理器来处理。

优点:

 降低了请求和处理器之间的耦合。很轻易增加一个处理器来处理这个请求。只要维护这个环型结构就OK

缺点:由于每次请求,不知道由哪个处理器来处理(客户端并不知道)。所以每次都要遍历环形结构中所有处理器类。这样导致效率比较低下。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics