澳门新葡亰娱乐网站-www.142net-欢迎您

澳门新葡亰娱乐网站是因为你还没有找到一条正确的致富之路,www.142net是将所有的游戏都汇集在一起的官方平台,因为澳门新葡亰娱乐网站这个网站当中有着大量的游戏攻略,托IP定位技术,传达终端直接到达的精准传播方式。

责任链模式

来源:http://www.bhtsgq.com 作者:计算机知识 人气:88 发布时间:2019-05-30
摘要:职务链格局-Chain of Responsibility 在这种方式中,日常各个接收者都包括对另八个接收者的引用。假如贰个对象不可能处理该请求,那么它会把同样的乞请传给下一个接收者,由此及彼。

职务链格局-Chain of Responsibility

在这种方式中,日常各个接收者都包括对另八个接收者的引用。假如贰个对象不可能处理该请求,那么它会把同样的乞请传给下一个接收者,由此及彼。

咱俩在此地换二个光景:

君王(King类), 经常会遇到各类劳动(Trouble类), 而国王壹旦遇见麻烦, 则会把费劲交给手下去做.

责任链模式。太岁有一天上了沙场, 职分法派的逐条是那样的, 骑兵先上, 骑兵不行步兵上, 步兵不行就换贴身护卫上.

义务链情势-Chain of Responsibility, 例1

在这种格局中,常常各个接收者都包涵对另三个接收者的引用。借使二个目标不可能管理该请求,那么它会把一样的请求传给下1个接收者,依此类推。

Java Chain of Responsibility Pattern(义务链情势)

义务链方式(Chain of Responsibility Pattern)为呼吁成立了2个接收者对象的链。这种形式给予请求的连串,对请求的发送者和接收者进行解耦。那连串型的设计方式属于行为型形式。
在这种情势中,平日各类接收者都包罗对另三个接收者的引用。假如二个对象不可能管理该请求,那么它会把一样的伸手传给下二个接收者,由此及彼。

重要代码:Handler 里面聚合它和煦,在 HanleRequest 里推断是还是不是妥帖,假若没达到规定的标准标准则向下传递,向什么人传递此前 set 进去。

优点: 一、下跌耦合度。它将请求的发送者和接收者解耦。 2、简化了对象。使得对象无需知道链的构造。 叁、巩固给目的指派任务的灵活性。通过转移链内的成员要么调度它们的次第,允许动态地新添大概去除权利。 四、增添新的伏乞管理类很有利。
症结: 1、不可能保险请求一定被接到。 二、系统质量将蒙受断定影响,而且在拓展代码调节和测试时不太有利,只怕会变成循环调用。 三、也许不易于观看运营时的天性,有碍于除错。

  1. 开创抽象的记录器类。
/**
 * 1. 创建抽象的记录器类。
 * @author mazaiting
 */
public abstract class AbstractLogger {
    public static int INFO = 1;
    public static int DEBUG = 2;
    public static int ERROR = 3;

    protected int level;
    /**责任链中的下一个元素*/
    protected AbstractLogger nextLogger;
    /**设置责任链中的下一个元素*/
    public void setNextLogger(AbstractLogger nextLogger) {
        this.nextLogger = nextLogger;
    }
    /**打印信息*/
    public void logMessage(int level, String message){
        if (this.level <= level){
            write(message);
        }
        if (nextLogger != null) {
            nextLogger.logMessage(level, message);
        }
    }
    /**写消息*/
    protected abstract void write(String message);


}
  1. 制造扩充了该记录器类的实体类。
/**
 * 2. 创建扩展了该记录器类的实体类。
 * @author mazaiting
 */
public class ConsoleLogger extends AbstractLogger{

    public ConsoleLogger(int level){
        this.level = level;
    }

    @Override
    protected void write(String message) {
        System.out.println("Standard Console::Logger: "   message);
    }

}

/**
 * 2. 创建扩展了该记录器类的实体类。
 * @author mazaiting
 */
public class ErrorLogger extends AbstractLogger{

    public ErrorLogger(int level){
        this.level = level;
    }

    @Override
    protected void write(String message) {
        System.out.println("Standard Error::Logger: "   message);
    }

}

/**
 * 2. 创建扩展了该记录器类的实体类。
 * @author mazaiting
 */
public class FileLogger extends AbstractLogger{

    public FileLogger(int level){
        this.level = level;
    }

    @Override
    protected void write(String message) {
        System.out.println("Standard File::Logger: "   message);
    }

}
  1. 创设差异品种的记录器。赋予它们分化的错误等级,并在各种记录器中安装下三个记录器。各样记录器中的下二个记录器代表的是链的1局部。
/**
 * 3. 创建不同类型的记录器。赋予它们不同的错误级别,并在每个记录器中设置下一个记录器。
 * 每个记录器中的下一个记录器代表的是链的一部分
 * @author mazaiting
 */
public class Client {
    public static void main(String[] args) {
        AbstractLogger loggerChain = getChainOfLoggers();

        loggerChain.logMessage(AbstractLogger.INFO, 
                 "This is an information.");

              loggerChain.logMessage(AbstractLogger.DEBUG, 
                 "This is an debug level information.");

              loggerChain.logMessage(AbstractLogger.ERROR, 
                 "This is an error information.");
    }

    /**
     * 获取责任链
     */
    private static AbstractLogger getChainOfLoggers(){
        AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
        AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);
        AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);

        errorLogger.setNextLogger(fileLogger);
        fileLogger.setNextLogger(consoleLogger);

        return errorLogger;     
    }
}
  1. 打字与印刷结果
Standard Console::Logger: This is an information.
Standard File::Logger: This is an debug level information.
Standard Console::Logger: This is an debug level information.
Standard Error::Logger: This is an error information.
Standard File::Logger: This is an error information.
Standard Console::Logger: This is an error information.

职分链方式是1种设计形式。在义务链格局里,繁多目的由每2个指标对其下家的引用而连接起来产生一条链。请求在这么些链上传递,直到链上的某二个目的说了算拍卖此恳请。发出这几个请求的客户端并不知道链上的哪多少个对象最终管理那个请求,那使得系统能够在不影响客户端的情事下动态地再一次协会和分配义务。

TroubleType枚举

在此处枚举了, 皇帝在战场上有三种业务会分派给手下去做

public enum TroubleType {
    DEFEND, ATTACK, PROTECT
}  

Trouble类

本类是:待责任链来处理的主题材料Trouble类.

本例子较轻巧, Trouble唯有3个int型作为待管理的编号.

public class Trouble {
    private int number;

    public Trouble(int number) {
        this.number = number;
    }

    public int getNumber() {
        return number;
    }

    public String toString() {
        return "[Trouble "   number   "]";
    }
}

 

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抽象类

Support类是职责链中的节点抽象出来的合并定义.

public abstract class Support {
    private String name;
    private Support next;

    public Support(String name) {
        this.name = name;
    }

    public Support setNext(Support next) {
        this.next = next;
        return next;
    }

    protected abstract boolean solve(Trouble trouble);

    protected void done(Trouble trouble) {  // 解决
        System.out.println(trouble   " is resolved by "   this   ".");
    }

    protected void fail(Trouble trouble) {  // 未解决
        System.out.println(trouble   " cannot be resolved.");
    }

    public void execute(Trouble trouble) {
        if (solve(trouble)) {
            done(trouble);
        } else if (next != null) {
            next.execute(trouble);
        } else {
            fail(trouble);
        }
    }

    public String toString() {
        return "["   name   "]";
    }
}

在阎宏博士的《JAVA与方式》一书中开首是这么描述义务链(Chain of Responsibility)形式的:

本文由澳门新葡亰发布于计算机知识,转载请注明出处:责任链模式

关键词: Java 设计 设计模式 责任链模式

上一篇:责任链模式

下一篇:没有了

频道精选

最火资讯