設計模式練習(12)——職責鏈模式

職責鏈模式

一、題目:

在戰鬥中,一般根據戰爭規模的大小和重要性,由不同級別的長官(officer)來下達作戰指令,情報人員向上級提交軍情(包括敵人人數等信息),作戰命令需要上級批准,如果直接上級不具備下達命令的權力,則傳遞給他的上級,直到有人可以決定爲止。現使用職責鏈模式來模擬該過程,客戶類模擬情報人員,首先向級別最低的班長(Bangzhang),提交任務書(Mission),即軍情,如果超出班長的權限範圍,則傳遞給排長(Paizhang),排長如果不能處理,則傳遞給營長(Yingzhang),如果營長不能處理,則需要開會討論,設置着幾級長官的權限範圍分別是:
1>. 敵人數量小<10人,班長下達作戰指令
2>. 10=<敵人數量<50,排長下達作戰指令
3>. 50=<敵人數量<200,營長下達作戰指令
4>. 200=<敵人數量,需要開會討論
(1)繪製職責鏈模式結構視圖;
(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);
    }


}

五、運行結果:

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章