一、職責鏈模式
1、uml圖
handler類:定義乙個處理請示的介面。
concretehandler類:具體處理者類,處理它所負責的請求,可訪問它的後繼者,如果可處理該請求,就處理之,否則就將該請求**給它的後繼者。
concretelhandler1類:當請求數在0到10之間則有權處理,否則轉到下一位。
concretehandler2類:當請求數在10到20之間則有權處理,否則轉到下一位。
concretehandler3類:當請求數在20到30之間則有權處理,否則轉到下一位。
abstract
class
handler
public
abstract
void
handlerequest
(int request)
;public string getname()
public
void
setname
(string name)
}class
concretehandler1
extends
handler
else
if(successor!=null)}}
class
concretehandler2
extends
handler
else
if(successor!=null)}}
class
concretehandler3
extends
handler
else
if(successor!=null)}}
public
class
main
;for
(int i=
0;i}
//結果為:
審批人1處理請求2
審批人1處理請求5
審批人2處理請求14
審批人3處理請求22
審批人2處理請求18
審批人1處理請求3
審批人3處理請求27
審批人3處理請求20
優點:缺點:1、問題背景加薪申請、上報與審批員工向經理發起加薪申請,經理無權決定,需要向總監匯報,如果加薪額度超過總監權力範圍,需要向總經理匯報。員工還可以提交請假申請,經理可以決定2天以下的假,總監可以決定5天以下的假,其餘都要上報總經理。
2、初步**
//申請:小菜請求加薪2000/小菜請假3天
class
request
public
void
setrequesttype
(string requesttype)
public string getrequestcontent()
public
void
setrequestcontent
(string requestcontent)
public
intgetnumber()
public
void
setnumber
(int number)
}//管理者
class
manager
public
void
getresult
(string managerlevel,request request)
else
}else
if(managerlevel==
"總監"
)else
}else
if(managerlevel==
"總經理"
)else
if(request.
getrequesttype()
=="加薪"
&&request.
getnumber()
<=
500)
else
if(request.
getrequesttype()
=="加薪"
&&request.
getnumber()
>
500)}}
}public
class
main
}
出現問題:manager類的getresult方法比較長,且有太多的分支判斷,這是不好的設計,因為可能還會增加其他的管理美別,比如專案經理、部門經理、人力總監、副總經理等等,那就意味著需要去更改manager類,這個類承擔了太多的責任,違背了單一職責原則,增加新的管理類別,需要修改這個類,違背了開放-封閉原則。
改進:
class
request
public
void
setrequesttype
(string requesttype)
public string getrequestcontent()
public
void
setrequestcontent
(string requestcontent)
public
intgetnumber()
public
void
setnumber
(int number)
}//管理者類
abstract
class
manager
//設定管理者的上級
public
void
setsuperrior
(manager superior)
abstract
public
void
(request request);}
class
commonmanager
extends
manager
@override
public
void
(request request)
else}}
}class
majordomo
extends
manager
@override
public
void
(request request)
else}}
}class
generalmanager
extends
manager
@override
public
void
(request request)
else
if(request.
getrequesttype()
=="加薪"
&&request.
getnumber()
<=
500)
else}}
public
class
main
}
設計模式 職責鏈模式
2008年08月17日 星期日 下午 04 28 using system using system.collections.generic using system.text public officer officer o public abstract void deal action a c...
設計模式 職責鏈模式
1 request.h ifndef request h define request h include include using namespace std class request 請求類定義 endif request h 2 manager.h ifndef manager h def...
設計模式 職責鏈模式
今天跟大家分享下設計模式中的職責鏈模式。不知道大家在學習職責鏈模式的時候是否感覺困難。我剛開始學的時候就被整暈了。呵呵,進入正題。職責鏈模式是物件行為型模式中比較有特點的設計模式了,的確有意思,它可以像資料結構中煉表一樣傳遞。其實生活中好多的行為方式都體現了職責鏈模式,我們初期學習者可以把職責鏈模式...