设计模式练习(12)——职责链模式

职责链模式

一、题目:

在战斗中,一般根据战争规模的大小和重要性,由不同级别的长官(officer)来下达作战指令,情报人员向上级提交军情(包括敌人人数等信息),作战命令需要上级批准,如果直接上级不具备下达命令的权力,则传递给他的上级,直到有人可以决定为止。现使用职责链模式来模拟该过程,客户类模拟情报人员,首先向级别最低的班长(Bangzhang),提交任务书(Mission),即军情,如果超出班长的权限范围,则传递给排长(Paizhang),排长如果不能处理,则传递给营长(Yingzhang),如果营长不能处理,则需要开会讨论,设置着几级长官的权限范围分别是:
1>. 敌人数量小<10人,班长下达作战指令
2>. 10=<敌人数量<50,排长下达作战指令
3>. 50=<敌人数量<200,营长下达作战指令
4>. 200=<敌人数量,需要开会讨论
(1)绘制职责链模式结构视图;
(2)请绘制该实例类图,并代码实现。

二、所用模式结构视图:

设计模式练习(12)——职责链模式_第1张图片

三、实例类图:

设计模式练习(12)——职责链模式_第2张图片

四、实例实现代码:

(因为区分,所以在类的前面加了Gj19)

抽象处理者

package gjChainofResponsibilityPattern;
/**
 * 抽象处理者
 * @author gong
 *
 */
public abstract class Gj19Officer {
     
    protected String name;
    protected Gj19Officer gj19successor;

    public Gj19Officer(String name)
    {
        this.name=name;
    }
    public void setgj19Successor(Gj19Officer gj19successor)
    {
        this.gj19successor=gj19successor;
    }
    public abstract void handleMission(Gj19Mission mission);
}

军情信息

package gjChainofResponsibilityPattern;
/**
 * 军情信息
 * @author gong
 *
 */
public class Gj19Mission {
     
    private String  soldierName;  //情报人员名称
    private int  enemyNumber;   //敌人数量


    public Gj19Mission() {
        super();
    }
    public Gj19Mission(String soldierName, int enemyNumber) {
        super();
        this.soldierName = soldierName;
        this.enemyNumber = enemyNumber;
    }
    public String getSoldierName() {
        return soldierName;
    }
    public void setSoldierName(String soldierName) {
        this.soldierName = soldierName;
    }
    public int getEnemyNumber() {
        return enemyNumber;
    }
    public void setEnemyNumber(int enemyNumber) {
        this.enemyNumber = enemyNumber;
    }


}

具体处理者–班长

package gjChainofResponsibilityPattern;
/**
 * 具体处理者--班长
 * @author gong
 *
 */
public class Gj19Bangzhang extends Gj19Officer{
     

    public Gj19Bangzhang(String name) {
        super(name);
    }

    @Override
    public void handleMission(Gj19Mission mission) {
        if(mission.getEnemyNumber()>0 && mission.getEnemyNumber()<10){
            System.out.println("班长"+name+"接到"+mission.getSoldierName()+"的军情"+",敌人数量为"+mission.getEnemyNumber()+",可以下达作战指令");
        }else{
            if(this.gj19successor!=null)
            {
                this.gj19successor.handleMission(mission);
            }
        }
    }


}

具体处理者–排长

package gjChainofResponsibilityPattern;
/**
 * 具体处理者--排长
 * @author gong
 *
 */
public class Gj19Paizhang extends Gj19Officer{
     

    public Gj19Paizhang(String name) {
        super(name);
    }

    @Override
    public void handleMission(Gj19Mission mission) {
        if(mission.getEnemyNumber()>=10 && mission.getEnemyNumber()<50){
            System.out.println("排长"+name+"接到"+mission.getSoldierName()+"的军情"+",敌人数量为"+mission.getEnemyNumber()+",可以下达作战指令");
        }else{
            if(this.gj19successor!=null)
            {
                this.gj19successor.handleMission(mission);
            }
        }
    }


}

具体处理者–营长

package gjChainofResponsibilityPattern;
/**
 * 具体处理者--营长
 * @author gong
 *
 */
public class Gj19Yingzhang extends Gj19Officer{
     

    public Gj19Yingzhang(String name) {
        super(name);
    }

    @Override
    public void handleMission(Gj19Mission mission) {
        if(mission.getEnemyNumber()>=50 && mission.getEnemyNumber()<200){
            System.out.println("营长"+name+"接到"+mission.getSoldierName()+"的军情"+",敌人数量为"+mission.getEnemyNumber()+",可以下达作战指令");
        }else{
            System.out.println("接到"+mission.getSoldierName()+"的军情"+",敌人数量为"+mission.getEnemyNumber()+",敌人太多了,我们开会讨论一下吧!");
        }
    }


}

职责链模式客户端类

package gjChainofResponsibilityPattern;
/**
 * 职责链模式客户端类
 * @author gong
 *
 */
public class Gj19Client {
     
    public static void main(String[] args) {
        Gj19Officer gj19Bangzhang = new Gj19Bangzhang("张小三");
        Gj19Officer gj19Paizhang  = new Gj19Paizhang("李小四");
        Gj19Officer gj19Yingzhang =new Gj19Yingzhang("王小五");

        gj19Bangzhang.setgj19Successor(gj19Paizhang);
        gj19Paizhang.setgj19Successor(gj19Yingzhang);

        Gj19Mission m1 = new Gj19Mission("周小妹", 8);
        gj19Bangzhang.handleMission(m1);

        Gj19Mission m2 = new Gj19Mission("曾小妹", 36);
        gj19Bangzhang.handleMission(m2);

        Gj19Mission m3 = new Gj19Mission("李小妹", 188);
        gj19Bangzhang.handleMission(m3);

        Gj19Mission m4 = new Gj19Mission("孙小妹", 269);
        gj19Bangzhang.handleMission(m4);
    }


}

五、运行结果:

设计模式练习(12)——职责链模式_第3张图片

你可能感兴趣的:(设计模式,设计模式,职责链,职责链模式,class)