精通23种设计模式——责任链模式

责任链模式

依然从例子出发去理解责任链模式,以篮球运动员为例子,一名运动员,其一些行动都要受周围的人的约束,比如教练管理球员,经纪人管理球员的签约情况,营养师管理球员的饮食等等等等。那么当球员需要做某某不好的事情的时候,比如去吃麦当劳,打野球或者希望球队交易自己,那么都需要寻求对应负责人的意见。

所以,定义一个球员接口,包含两种方法,getType()为某件事情的类型,getRequest为某件事的具体内容。

public interface IPlayer {

    public int getType();

    public String getRequest();
}

定义一个抽象类Handler,这里可以看出,也应用了模板方法的设计模式,在抽象类中处理了所有请求的公共部分,具体的响应留给子类来实现。
Handler类中定义了三种类型:
EAT_LEVEL_REQUEST: 饮食方面的请求
PLAY_LEVEL_REQUEST: 打球方面的请求
MONEY_LEVEL_REQUEST: 经济方面的请求
依据球员的不同请求类型,做出响应的判断,并交给对应的子类实现

public abstract class Handler {

    public final static int EAT_LEVEL_REQUEST = 1;
    public final static int PLAY_LEVEL_REQUEST = 2;
    public final static int MONEY_LEVEL_REQUEST = 3;

    private int level = 0;

    public Handler nextHandler;

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

    public final void handleMessage(IPlayer player){
        if (player.getType() ==  this.level){
            this.response(player);
        }else {
            if (this.nextHandler != null){
                this.nextHandler.handleMessage(player);
            }else {
                System.out.println("没地方请示了,按不同意处理");
            }
        }
    }

    public void setNext(Handler handler){
        this.nextHandler = handler;
    }

    public abstract void response(IPlayer player);
}

为抽象类定义三个实现的子类:
饮食方面的子类:营养师

public class Dietician extends Handler{

    public Dietician() {
        super(Handler.EAT_LEVEL_REQUEST);
    }

    @Override
    public void response(IPlayer player) {
        System.out.println("不可以吃麦当劳");
    }
}

打球方面的子类: 教练

public class Coach extends Handler{

    public Coach() {
        super(Handler.PLAY_LEVEL_REQUEST);
    }

    @Override
    public void response(IPlayer player) {
        System.out.println("不可以打野球");
    }
}

经济方面的子类: 经纪人

public class Agent extends Handler{

    public Agent() {
        super(Handler.MONEY_LEVEL_REQUEST);
    }

    @Override
    public void response(IPlayer player) {
        System.out.println("请求交易失败");
    }
}

最后,来实现场景类:
定义了三种球员,分别发起了三种不同的请求,并设置好三个责任人coach,agent, dietician的责任顺序,最开始请求都由coach处理,然后依据责任顺序,依次寻找答复。

public class Client {

    public static void main(String[] args){
        Handler coach = new Coach();
        Handler agent = new Agent();
        Handler dietician = new Dietician();

        coach.setNext(agent);
        agent.setNext(dietician);

        IPlayer player1 = new Player(1);
        IPlayer player2 = new Player(2);
        IPlayer player3 = new Player(3);

        coach.handleMessage(player1);
        coach.handleMessage(player2);
        coach.handleMessage(player3);

    }
}

应用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值