職責鏈模式
一、題目:
在戰鬥中,一般根據戰爭規模的大小和重要性,由不同級別的長官(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);
}
}
五、運行結果: