• 责任链模式-Chain of Responsibility(Java实现), 例2


    责任链模式-Chain of Responsibility

    在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

    咱们在这里换一个场景:

    国王(King类), 经常会遇到各种麻烦(Trouble类), 而国王一旦遇到麻烦, 则会把麻烦交给手下去做.

    国王有一天上了战场, 任务法派的顺序是这样的, 骑兵先上, 骑兵不行步兵上, 步兵不行就换贴身侍卫上.

    TroubleType枚举

    在这里枚举了, 国王在战场上有三种事情会分派给手下去做

    public enum TroubleType {
        DEFEND, ATTACK, PROTECT
    }  

    Trouble类

    这里是国王分配的事情

    public class Trouble {
        private final TroubleType troubleType;
        private final String requestDescription;
    
        public Trouble(final TroubleType troubleType, final String requestDescription) {
            this.troubleType = Objects.requireNonNull(troubleType);
            this.requestDescription = Objects.requireNonNull(requestDescription);
        }
    
        public String getRequestDescription() {
            return requestDescription;
        }
    
        public TroubleType getRequestType() {
            return troubleType;
        }
    
        @Override
        public String toString() {
            return getRequestDescription();
        }
    }

    Support抽象类

    国王的手下解决Trouble都会实现这个Support借口, Support借口是解决Trouble的统一定义

    public abstract class Support {
    
        private Support next;
    
        public Support(Support next) {
            this.next = next;
        }
    
        public void handleRequest(Trouble trouble) {
            if (next != null) {
                next.handleRequest(trouble);
            }
        }
    
        protected void printHandling(Trouble trouble) {
            System.out.printf("%s 执行任务: %s
    ", this, trouble);
        }
    
        @Override
        public abstract String toString();
    }

    RiderSupport类

    骑兵在本例子中只负责进攻

    public class RiderSupport extends Support {
    
        public RiderSupport(Support support) {
            super(support);
        }
    
        @Override
        public void handleRequest(Trouble trouble) {
            if (trouble.getRequestType().equals(TroubleType.ATTACK)) {
                printHandling(trouble);
            } else {
                super.handleRequest(trouble);
            }
        }
    
        @Override
        public String toString() {
            return "Rider";
        }
    
    }

    SolderSupport类

    步兵在本例子中只负责防守

    public class SolderSupport extends Support {
    
        public SolderSupport(Support support) {
            super(support);
        }
    
        @Override
        public void handleRequest(Trouble trouble) {
            if (trouble.getRequestType().equals(TroubleType.DEFEND)) {
                printHandling(trouble);
            } else {
                super.handleRequest(trouble);
            }
        }
    
        @Override
        public String toString() {
            return "Soldier";
        }
    }

    GuardSupport类

    本类负责保卫国王

    public class GuardSupport extends Support {
        public GuardSupport(Support next) {
            super(next);
        }
    
        @Override
        public void handleRequest(Trouble trouble) {
            if (trouble.getRequestType().equals(TroubleType.PROTECT)) {
                printHandling(trouble);
            } else {
                super.handleRequest(trouble);
            }
        }
    
        @Override
        public String toString() {
            return "Guard";
        }
    }

    King类

    本类负责维护责任链.

    public class King {
        private Support chain;
    
        public King() {
            buildChain();
        }
    
        private void buildChain() {
            chain = new RiderSupport(new SolderSupport(new GuardSupport(null)));
        }
    
        public void resolve(Trouble trouble) {
            chain.handleRequest(trouble);
        }
    }

    Main

    运行测试

    public class Main {
        public static void main(String[] args) {
            King king = new King();
            king.resolve(new Trouble(TroubleType.DEFEND, "防御"));
            king.resolve(new Trouble(TroubleType.ATTACK, "进攻"));
            king.resolve(new Trouble(TroubleType.PROTECT, "保护国王"));
        }
    }
    

      

  • 相关阅读:
    SQL——SELECT、UPDATE、DELETE和INSERT INTO
    Java——关键字instanceof
    Linux——vim操作
    Java——变量自增(++)自减(--)
    Maven——pom.xml文件报错:Missing artifact:jar包
    Linux清空文件内容
    MySQL数据库传输BLOB类型数据丢失 解决办法
    【转载】StringUtils方法介绍
    Maven学习记录
    Hibernate中自带ID的generator的含义
  • 原文地址:https://www.cnblogs.com/noKing/p/9034251.html
Copyright © 2020-2023  润新知