责任链模式
依然从例子出发去理解责任链模式,以篮球运动员为例子,一名运动员,其一些行动都要受周围的人的约束,比如教练管理球员,经纪人管理球员的签约情况,营养师管理球员的饮食等等等等。那么当球员需要做某某不好的事情的时候,比如去吃麦当劳,打野球或者希望球队交易自己,那么都需要寻求对应负责人的意见。
所以,定义一个球员接口,包含两种方法,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);
}
}