zoukankan      html  css  js  c++  java
  • 【设计模式】责任链模式

    使用频率:★★★☆☆

    一、什么是责任链模式

    为请求创建了一个接收者对象的链,每个接收者都包含对另一个接收者的引用,当某个接受者不能处理该请求时,会将该请求转给下一个接受者处理;

    二、补充说明

    请求发送者与请求接受者解耦

    应用例子:struts的拦截器,servlet的过滤器

    三、角色

    抽象请求处理者

    具体请求处理者:包含下一个具体请求处理者的引用

    客户端:请求发送者

    四、例子,JAVA实现

    说明:模拟一个村、镇、县的责任链关系请求

    抽象处理者

    package com.pichen.dp.behavioralpattern.chain;
    
    public abstract class Handler {
    
        protected Handler next;
    
        public abstract void handleRequest(String value);
    
        public Handler next() {
            return this.next;
        }
    
        public void setNext(Handler next) {
            this.next = next;
        }
    }

    具体村、镇、县处理者

    package com.pichen.dp.behavioralpattern.chain;
    
    public class VillageHandler extends Handler {
    
        /**
         * @see com.pichen.dp.behavioralpattern.chain.Handler#handleRequest()
         */
        @Override
        public void handleRequest(String value) {
            if ("village".equals(value)) {
                System.out.println("VillageHandler: handled~");
            } else {
                System.out.println("VillageHandler: pass~");
                this.next.handleRequest(value);
            }
        }
    
    }
    package com.pichen.dp.behavioralpattern.chain;
    
    public class TownHandler extends Handler {
    
        @Override
        public void handleRequest(String value) {
            if ("town".equals(value)) {
                System.out.println("VillageHandler: handled~");
            } else {
                System.out.println("Town: pass~");
                this.next.handleRequest(value);
            }
        }
    }
    package com.pichen.dp.behavioralpattern.chain;
    
    public class CountyHandler extends Handler {
    
        @Override
        public void handleRequest(String value) {
            if ("county".equals(value)) {
                System.out.println("County: handled~");
            } else if (this.next == null) {
                System.out
                        .println("no next Handler, this request can not be handle~");
            } else {
                System.out.println("County: pass~");
                this.next.handleRequest(value);
            }
        }
    }

    客户端:

    package com.pichen.dp.behavioralpattern.chain;
    
    public class Main {
    
        public static void main(String[] args) {
            Handler villageHandler = new VillageHandler();
            Handler townHandler = new TownHandler();
            Handler countyHandler = new CountyHandler();
            
            villageHandler.setNext(townHandler);
            townHandler.setNext(countyHandler);
            
            System.out.println("test county request:");
            villageHandler.handleRequest("county");
            
            System.out.println("
    test city request:");
            villageHandler.handleRequest("city");
        }
    }

    结果:

    test county request:
    VillageHandler: pass~
    Town: pass~
    County: handled~
    
    test city request:
    VillageHandler: pass~
    Town: pass~
    no next Handler, this request can not be handle~
  • 相关阅读:
    省市区多级联动数据组合
    常用字符串函数
    设计模式分类
    计算机网络学习笔记(绪论第一部分)
    关于JAVA核心技术(卷一)读后的思考(继承中的类、子类和超类)
    关于JAVA核心技术(卷一)读后的思考(用户自定义类,静态域和静态方法的思考以及方法参数)
    关于JAVA核心技术(卷一)读后的思考(对象与类,日历的构造)
    微型学生信息管理系统的建立
    PHP异常处理(Exception)
    使用trait中相同方法的优先级问题
  • 原文地址:https://www.cnblogs.com/chenpi/p/5217038.html
Copyright © 2011-2022 走看看