zoukankan      html  css  js  c++  java
  • GoF23种设计模式之行为型模式之责任链模式

    一、概述

            使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并且沿着这条链传递请求,直到有一个对象处理它为止。其设计思想是:给对多个对象处理一个请求的机会,从而解耦请求发送者和接收者。

    二、适用性

    1.有多个对象可以处理一个请求,到底是哪个对象处理请求,交由运行时刻自动确定的时候。

    2.你想在不明确指定接收者的情况下,向多个对象中的一个发送请求的时候。

    3.可以处理一个请求的对象集合应该被动态指定的时候。

    三、参与者

    1.Handler:定义一个处理请求的接口。可能的话实现后继链(option)。

    2.ConcreteHandler:链上的具体处理者。处理它负责的请求。可以访问它的后继。如果可以处理该请求,就处理;否则将该请求转发给其后继。

    3.Client:向链上的具体处理者对象提交请求。

    四、类图


    五、示例

    Handler

    package cn.lynn.chainofresponsibility;
    
    public interface IRequestHandler {
    
        public void handleRequest(IRequest request);
    
    }
    
    ConcreteHandler
    package cn.lynn.chainofresponsibility;
    
    public class SunRequestHandler implements IRequestHandler {
    
        @Override
        public void handleRequest(IRequest request) {
            if(request instanceof FightRequest) {
                System.out.println("悟空火眼金睛,三打白骨精!");
            }
        }
    
    }
    
    package cn.lynn.chainofresponsibility;
    
    public class ZhuRequestHandler implements IRequestHandler {
        private IRequestHandler handler;
        
        public ZhuRequestHandler(IRequestHandler handler) {
            this.handler = handler;
        } 
    
        @Override
        public void handleRequest(IRequest request) {
            if(request instanceof PeepRequest) {
                System.out.println("八戒偷窥嫦娥,被贬下凡!");
            }
            handler.handleRequest(request);
        }
    
    }
    
    package cn.lynn.chainofresponsibility;
    
    public class ShaRequestHandler implements IRequestHandler {
    
        private IRequestHandler handler;
        
        public ShaRequestHandler(IRequestHandler handler) {
            this.handler = handler;
        } 
        
        @Override
        public void handleRequest(IRequest request) {
            if(request instanceof FindRequest) {
                System.out.println("师傅让妖怪抓走了,沙增找不到!");
            }
            handler.handleRequest(request);
        }
    
    }
    
    Client
    package cn.lynn.chainofresponsibility;
    
    public class Client {
    
        public static void main(String[] args) {
            IRequestHandler sun = new SunRequestHandler();
            IRequestHandler zhu = new ZhuRequestHandler(sun);
            IRequestHandler sha = new ShaRequestHandler(zhu);
            
            IRequest request = new FindRequest();
            sha.handleRequest(request);
            
            request = new PeepRequest();
            zhu.handleRequest(request);
            
            request = new FightRequest();
            sun.handleRequest(request);
        }
    
    }
    
    Result
    师傅让妖怪抓走了,沙增找不到!
    八戒偷窥嫦娥,被贬下凡!
    悟空火眼金睛,三打白骨精!

  • 相关阅读:
    2020系统综合实践 第6次实践作业
    2020系统综合实践 第5次实践作业
    2020系统综合实践 第4次实践作业
    2020系统综合实践 第3次实践作业
    2020系统综合实践 第2次实践作业
    2020系统综合实践 第1次实践作业
    2019 SDN大作业
    2019 SDN上机第7次作业
    软工实践个人总结
    第03组 Beta冲刺(5/5)
  • 原文地址:https://www.cnblogs.com/innosight/p/3271210.html
Copyright © 2011-2022 走看看