面向对象的设计模式(八),责任链模式

废话不多说,最近要期末考试了,还没预习呢,下面直接进入正题。

定义:定义多个可以处理请求(承担责任)的类,并将它们连成一条链,沿着该链向下传递请求(责任),直到有能力解决问题(承担责任)的类处理之。这使得它们都有机会(看能力大小咯)处理请求。

使用场景:

  1. 一个请求有多个类可以处理,但具体由那个类处理要在运行时刻确定;
  2. 在请求不知道由谁来处理的时候,可以沿着责任链传递请求;
  3. 需要动态指定一组对象处理请求。

优点:

  • 使得请求者和处理者之前关系解耦,提高了代码灵活性。

缺点:

  • 影响程序的性能,尤其在递归调用中更为明显,因为势必要对链中的处理者遍历,直到找到合适的处理者。

以游戏BOSS悬赏为例,发布一个悬赏,招能人义士消灭BOSS。

代码实现:

悬赏 (请求)

/**
 * 悬赏 ----->请求
 * @author lt
 *
 */
public class Reward {
    /**
     * BOSS战斗力
     */
    public int bossFightingCapacity;
}

游戏角色(处理者Handler)

/**
 * 游戏角色  ---> 可以处理请求的处理者Handler
 * @author lt
 *
 */
public abstract class Role {

    public Role nextPlayer; // 下一个领了悬赏的玩家
    protected String roleName;

    public Role(String roleName){
        this.roleName = roleName;
    }

    /**
     * 得到玩家角色的战斗力
     * @return 战斗力
     */
    public abstract int getFightingCapacity();

    /**
     * 处理请求或者传递  -- 这里为领取悬赏任务,完成不了(战斗力不够)就下个领了悬赏的玩家完成(传递)
     * @param bossFightingCapacity,悬赏榜的BOSS的战斗力
     */
    public final void handleRequest(int bossFightingCapacity){
        if(bossFightingCapacity<=getFightingCapacity()){
            // BOSS战斗力不高于玩家,玩家就可以杀死BOSS
            killBOSS();
        }else{
            // BOSS太厉害了,由高手解决吧,自己泪闪了
            if(nextPlayer!=null){
                // 让下个玩家领取悬赏
                nextPlayer.handleRequest(bossFightingCapacity);
            }else{
                // 没人领悬赏
                System.out.println("这个BOSS为无敌BOSS,屌炸天!");
            }
        }
    }

    /**
     * 具体的处理方法 -- 这里为每个玩家怎么杀死BOSS的
     */
    public abstract void killBOSS();
}

?说明:每个具体的角色为一个玩家。

骑士小明

/**
 * 骑士小明
 * @author lt
 *
 */
public class XiaoMing extends Role {

    public XiaoMing(String roleName) {
        super(roleName);
    }

    @Override
    public int getFightingCapacity() {
        return 2000;
    }

    @Override
    public void killBOSS() {
        System.out.println("我是"+roleName+",我的大刀早已饥渴难耐了!BOSS被大刀砍杀了");
    }
}

法师小丽

/**
 * 法师小丽
 * @author lt
 *
 */
public class XiaoLi extends Role {

    public XiaoLi(String roleName) {
        super(roleName);
    }

    @Override
    public int getFightingCapacity() {
        return 1000;
    }

    @Override
    public void killBOSS() {
        System.out.println("我是"+roleName+",我的新魔杖,代表月亮消灭了BOSS!");
    }
}

猎手小华

/**
 * 猎手小华
 * @author lt
 *
 */
public class XiaoHua extends Role{

    public XiaoHua(String roleName) {
        super(roleName);
    }

    @Override
    public int getFightingCapacity() {
        return 3000;
    }

    @Override
    public void killBOSS() {
        System.out.println("我是"+roleName+",我的弓箭早已暗藏不住了!BOSS被射杀了");
    }
}

测试

悬赏一个2900战力的BOSS

public class Test {

    public static void main(String[] args) {
        Role xm = new XiaoMing("血魂骑士");
        Role xh = new XiaoHua("狙魔猎手");
        Role xl = new XiaoLi("秘法游侠");

        xl.nextPlayer = xm;
        // 通常高手都是最后一个出现的
        xm.nextPlayer = xh;

        // 今有一个2900战斗力的BOSS,需要能人义士来消灭
        Reward reward = new Reward();
        reward.bossFightingCapacity = 2900;

        // 小丽太激动了,第一个领了悬赏任务
        xl.handleRequest(reward.bossFightingCapacity);
    }
}

结果:

悬赏一个1900战力的BOSS

悬赏一个900战力的BOSS

总结:

?通过上面的BOSS悬赏测试,我们看到了当领取了悬赏任务的所有玩家中,当最先领取的玩家完成不了时会交给下面的玩家来完成否则自己来完成,直到有玩家可以杀死BOSS。这些领取了悬赏的所有玩家都在一条责任链中(杀死BOSS),使得他们都有机会去杀死BOSS,这就是责任链模式的简单实现。当然,责任链中的处理顺序也不是固定的,可以改变,如小丽完成不了可以直接交给小华,而不用先交给小明。

?责任链模式是为了处理某种请求而生的,当我们有这样的请求的时候可以考虑使用该模式,具体可以参考使用场景。好吧,该预习了,不能挂科了。

时间: 2024-08-24 12:46:29

面向对象的设计模式(八),责任链模式的相关文章

设计模式之责任链模式20170717

行为型设计模式之责任链模式: 一.含义 责任链模式的核心在"链"上,"链"是由多个处理者(对象)组成的,由这条链传递请求,直到有对象处理它为止(在链中决定谁来处理这个请求),并返回相应的结果 二.代码说明 1.主要有两个角色 1)处理者 它能够对请求做出处理(请求得到处理则直接返回,否则传到下一个处理者),设置下一个处理者(这两个操作可以抽象出来), 同时每个处理者都有一个相应的处理级别,以及具体的处理操作(父类实现请求传递,子类实现请求处理) 2)被处理者(请求者

Java设计模式菜鸟系列(十八)责任链模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40018231 责任链模式(ChainOfResponsibility): 有多个对象,每个对象持有下一个对象的引用,形成一条链,请求在这条链上传递,直到某一对象决定处理该请求,但是发出者并不清楚最终哪个对象会处理该请求. 一.uml建模: 二.代码实现 /** * 责任链模式:有多个对象,每个对象持有下一个对象的引用,形成一条链, * * 请求在这条链上传递,直到某一对象决定处理该请求,

C#设计模式:责任链模式

设计模式是面向对象编程的基础,是用于指导程序设计.在实际项目开发过程中,并不是一味将设计模式进行套用,也不是功能设计时大量引入设计模式.应该根据具体需求和要求应用适合的设计模式.设计模式是一个老话题了,因为最近在设计“网关API”组件(后续介绍),采用“责任链设计模式”进行设计,所以先进行回顾记录.  一.责任链模式介绍 责任链模式是指一个处理需要涉及多个过程或者角色参与处理,并基于某个约定组成一个链,每个过程或者角色拥有各自职责进行处理.责任链模式有效组织一个过程处理,同时子过程之间职责明确.

设计模式之责任链模式--- Pattern chain-of-responsibility

模式的定义 责任链模式定义如下: Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it. 使多个对象都有机会处理请求,从而避免请求的发送

设计模式_责任链模式

定义 Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.(使多个对象都有机会处理请求.从而避免了请求的发送者和接受者之间的耦合关系.

Java设计模式之责任链模式、职责链模式

本文继续介绍23种设计模式系列之职责链模式. 什么是链 1.链是一系列节点的集合. 2..链的各节点可灵活拆分再重组. 职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系, 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. 角色 抽象处理者角色(Handler):定义出一个处理请求的接口.如果需要,接口可以定义 出一个方法以设定和返回对下家的引用.这个角色通常由一个Java抽象类或者Java接口实现. 具体处理者角色(ConcreteHan

【GOF23设计模式】责任链模式

来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_责任链模式.公文审批.供应链系统的采购审批.异常链.过滤器和拦截器调用过程 1 package com.test.chainOfResp; 2 /** 3 * 封装请假的基本信息 4 */ 5 public class LeaveRequest { 6 private String empName; 7 private int leaveDays; 8 private String reason; 9 10 publi

Head First设计模式之责任链模式

一.定义 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止. 主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了. 何时使用:在处理消息的时候以过滤很多道. 如何解决:拦截的类都实现统一接口. 二.结构 从责任链模式的定义可以发现,责任链模式涉及的对象只有处理者角色,但由于有多个处理者,它们具有共同的处理请求的

23种设计模式之责任链模式(Chain of Responsibility)

责任链模式是一种对象的行为型模式,避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止.责任链模式不保证每个请求都被接受,由于一个请求没有明确的接收者,那么就不能保证它一定会被处理. 优点: 1)降低了耦合度. 2)增加向对象指定责任的灵活性. 3)由于在一个类中产生的事件可以被发送到组成中的其它类处理器上,类的集合可以作为一个整体. 使用场景: 1)多个对象可以处理一个请求,而其处理器却是未知的. 2)想要在不指定确

五分钟一个设计模式之责任链模式

五分钟一个设计模式,用最简单的方法来描述设计模式.查看更多设计模式,请点击五分钟一个设计模式系列 http://blog.csdn.net/daguanjia11/article/category/3259443 请假流程 假设现在一个公司的请假流程如下:一天及以下由小组组长审批,一天以上三天以下由经理审批,三天以上七天以下由老板审批,七天以上直接劝退. 如果每次请假时都很长的if-else-来判断该去找谁请假,很不容易扩展,我们使用责任链模式来实现. 首先,是一个抽象的父类 public ab