責任鏈模式 事務處理

2021-07-22 16:01:44 字數 2322 閱讀 7610

假設有這麼乙個場景,學生們有個問題,需要去處理。有大多數情況下學生個人就能搞定這個通知,如果不行就讓班長幫忙。班長也無能無力的時候就可以去找到輔導員,最終解決學生的問題。這中間就形成了乙個職責鏈,當前級別無法處理問題時,就往上交付,知道解決為止。在程式中也可以通過責任鏈模式來把上述的場景展現出來。

uml圖:

具體的**實現如下:

/**

*代表職務或者是請求(問題)的等級

*/public

enum status

/**

* 抽象請求

*/public

abstract

class

abstractrequest

public string getcontent()

//獲得請求級別

public

abstract enum getrequeststatus();

}

/**

* 不同級別的請求

*/class

requesta

extends

abstractrequest

@override

public enum getrequeststatus()

}class

requestb

extends

abstractrequest

@override

public enum getrequeststatus()

}class

requestc

extends

abstractrequest

@override

public enum getrequeststatus()

}

/**

* 抽象處理者

*/public

abstract

class

abstracthandler else else }}

//setter

public

void

setnexthandler(abstracthandler nexthandler)

//獲取處理者等級

public

abstract enum gethandlestatus();

//處理請求,在子類實現

public

abstract

void

handle(abstractrequest request);

}

//輔導員

class

counselor

extends

abstracthandler

@override

public

void handle(abstractrequest request)

}//班長

class

monitor

extends

abstracthandler

@override

public

void handle(abstractrequest request)

}//學生

class

student

extends

abstracthandler

@override

public

void handle(abstractrequest request)

}

最後,可以通過傳送請求來測試:

public

class client

}

結果:

student 處理不了 請求1

monitor 處理不了 請求1

counselor 處理 請求1

student 處理不了 請求2

monitor 處理 請求2

student 處理 請求3

一旦請求能夠被責任鏈上的其中乙個部分處理,那接下來就不會再傳遞下去了。這就是責任鏈模式的乙個簡單的實現方式。

優點:可以將請求者與處理者的關係分離解耦,提高**的靈活性。

缺點:每次都需要遍歷責任鏈來找到合適的處理者,當責任鏈過長時,可能會影響程式的效能。

PB事務處理

1 資料視窗更新,只要dberror有錯誤,而事先沒有做過任何commit工作,那麼rollback可以回滾到上次commit位置,即上次commit後所有的資料將被回滾。2 如果是直接寫入sql語句,只要資料庫出現錯誤,那麼rollback可以回滾到上次commit的位置,即上次commit後所有...

MySQL事務處理

start transaction,commit和rollback語法 start transaction begin work commit work and no chain no release rollback work and no chain no release set autocom...

ASP事務處理

asp事務處理。測試資料庫為sql server,伺服器為本機,資料庫名為test,表名為a,兩個欄位id int 主鍵標識,num int set conn server.createobject adodb.connection strconn provider sqloledb.1 persi...