設計模式 職責鏈模式

2021-10-07 04:42:13 字數 3742 閱讀 3733

一、職責鏈模式

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...

設計模式 職責鏈模式

今天跟大家分享下設計模式中的職責鏈模式。不知道大家在學習職責鏈模式的時候是否感覺困難。我剛開始學的時候就被整暈了。呵呵,進入正題。職責鏈模式是物件行為型模式中比較有特點的設計模式了,的確有意思,它可以像資料結構中煉表一樣傳遞。其實生活中好多的行為方式都體現了職責鏈模式,我們初期學習者可以把職責鏈模式...