日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

java 状态模式 同步_JAVA设计模式之状态模式

發(fā)布時(shí)間:2023/12/3 asp.net 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 状态模式 同步_JAVA设计模式之状态模式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在閻宏博士的《JAVA與模式》一書中開頭是這樣描述狀態(tài)(State)模式的:

狀態(tài)模式,又稱狀態(tài)對(duì)象模式(Pattern of Objects for States),狀態(tài)模式是對(duì)象的行為模式。

狀態(tài)模式允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變的時(shí)候改變其行為。這個(gè)對(duì)象看上去就像是改變了它的類一樣。

狀態(tài)模式的結(jié)構(gòu)

用一句話來(lái)表述,狀態(tài)模式把所研究的對(duì)象的行為包裝在不同的狀態(tài)對(duì)象里,每一個(gè)狀態(tài)對(duì)象都屬于一個(gè)抽象狀態(tài)類的一個(gè)子類。狀態(tài)模式的意圖是讓一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變的時(shí)候,其行為也隨之改變。狀態(tài)模式的示意性類圖如下所示:

狀態(tài)模式所涉及到的角色有:

●  環(huán)境(Context)角色,也成上下文:定義客戶端所感興趣的接口,并且保留一個(gè)具體狀態(tài)類的實(shí)例。這個(gè)具體狀態(tài)類的實(shí)例給出此環(huán)境對(duì)象的現(xiàn)有狀態(tài)。

●  抽象狀態(tài)(State)角色:定義一個(gè)接口,用以封裝環(huán)境(Context)對(duì)象的一個(gè)特定的狀態(tài)所對(duì)應(yīng)的行為。

●  具體狀態(tài)(ConcreteState)角色:每一個(gè)具體狀態(tài)類都實(shí)現(xiàn)了環(huán)境(Context)的一個(gè)狀態(tài)所對(duì)應(yīng)的行為。

源代碼

環(huán)境角色類

public classContext {//持有一個(gè)State類型的對(duì)象實(shí)例

privateState state;public voidsetState(State state) {this.state =state;

}/*** 用戶感興趣的接口方法*/

public voidrequest(String sampleParameter) {//轉(zhuǎn)調(diào)state來(lái)處理

state.handle(sampleParameter);

}

}

抽象狀態(tài)類

public interfaceState {/*** 狀態(tài)對(duì)應(yīng)的處理*/

public voidhandle(String sampleParameter);

}

具體狀態(tài)類

public class ConcreteStateA implementsState {

@Overridepublic voidhandle(String sampleParameter) {

System.out.println("ConcreteStateA handle :" +sampleParameter);

}

}

public class ConcreteStateB implementsState {

@Overridepublic voidhandle(String sampleParameter) {

System.out.println("ConcreteStateB handle :" +sampleParameter);

}

}

客戶端類

public classClient {public static voidmain(String[] args){//創(chuàng)建狀態(tài)

State state = newConcreteStateB();//創(chuàng)建環(huán)境

Context context = newContext();//將狀態(tài)設(shè)置到環(huán)境中

context.setState(state);//請(qǐng)求

context.request("test");

}

}

從上面可以看出,環(huán)境類Context的行為request()是委派給某一個(gè)具體狀態(tài)類的。通過(guò)使用多態(tài)性原則,可以動(dòng)態(tài)改變環(huán)境類Context的屬性State的內(nèi)容,使其從指向一個(gè)具體狀態(tài)類變換到指向另一個(gè)具體狀態(tài)類,從而使環(huán)境類的行為request()由不同的具體狀態(tài)類來(lái)執(zhí)行。

使用場(chǎng)景

考慮一個(gè)在線投票系統(tǒng)的應(yīng)用,要實(shí)現(xiàn)控制同一個(gè)用戶只能投一票,如果一個(gè)用戶反復(fù)投票,而且投票次數(shù)超過(guò)5次,則判定為惡意刷票,要取消該用戶投票的資格,當(dāng)然同時(shí)也要取消他所投的票;如果一個(gè)用戶的投票次數(shù)超過(guò)8次,將進(jìn)入黑名單,禁止再登錄和使用系統(tǒng)。

要使用狀態(tài)模式實(shí)現(xiàn),首先需要把投票過(guò)程的各種狀態(tài)定義出來(lái),根據(jù)以上描述大致分為四種狀態(tài):正常投票、反復(fù)投票、惡意刷票、進(jìn)入黑名單。然后創(chuàng)建一個(gè)投票管理對(duì)象(相當(dāng)于Context)。

系統(tǒng)的結(jié)構(gòu)圖如下所示:

源代碼

抽象狀態(tài)類

public interfaceVoteState {/*** 處理狀態(tài)對(duì)應(yīng)的行為

*@paramuser 投票人

*@paramvoteItem 投票項(xiàng)

*@paramvoteManager 投票上下文,用來(lái)在實(shí)現(xiàn)狀態(tài)對(duì)應(yīng)的功能處理的時(shí)候,

* 可以回調(diào)上下文的數(shù)據(jù)*/

public voidvote(String user,String voteItem,VoteManager voteManager);

}

具體狀態(tài)類——正常投票

public class NormalVoteState implementsVoteState {

@Overridepublic voidvote(String user, String voteItem, VoteManager voteManager) {//正常投票,記錄到投票記錄中

voteManager.getMapVote().put(user, voteItem);

System.out.println("恭喜投票成功");

}

}

具體狀態(tài)類——重復(fù)投票

public class RepeatVoteState implementsVoteState {

@Overridepublic voidvote(String user, String voteItem, VoteManager voteManager) {//重復(fù)投票,暫時(shí)不做處理

System.out.println("請(qǐng)不要重復(fù)投票");

}

}

具體狀態(tài)類——惡意刷票

public class SpiteVoteState implementsVoteState {

@Overridepublic voidvote(String user, String voteItem, VoteManager voteManager) {//惡意投票,取消用戶的投票資格,并取消投票記錄

String str =voteManager.getMapVote().get(user);if(str != null){

voteManager.getMapVote().remove(user);

}

System.out.println("你有惡意刷屏行為,取消投票資格");

}

}

具體狀態(tài)類——黑名單

public class BlackVoteState implementsVoteState {

@Overridepublic voidvote(String user, String voteItem, VoteManager voteManager) {//記錄黑名單中,禁止登錄系統(tǒng)

System.out.println("進(jìn)入黑名單,將禁止登錄和使用本系統(tǒng)");

}

}

環(huán)境類

public classVoteManager {//持有狀體處理對(duì)象

private VoteState state = null;//記錄用戶投票的結(jié)果,Map對(duì)應(yīng)Map

private Map mapVote = new HashMap();//記錄用戶投票次數(shù),Map對(duì)應(yīng)Map

private Map mapVoteCount = new HashMap();/*** 獲取用戶投票結(jié)果的Map*/

public MapgetMapVote() {returnmapVote;

}/*** 投票

*@paramuser 投票人

*@paramvoteItem 投票的選項(xiàng)*/

public voidvote(String user,String voteItem){//1.為該用戶增加投票次數(shù)//從記錄中取出該用戶已有的投票次數(shù)

Integer oldVoteCount =mapVoteCount.get(user);if(oldVoteCount == null){

oldVoteCount= 0;

}

oldVoteCount+= 1;

mapVoteCount.put(user, oldVoteCount);//2.判斷該用戶的投票類型,就相當(dāng)于判斷對(duì)應(yīng)的狀態(tài)//到底是正常投票、重復(fù)投票、惡意投票還是上黑名單的狀態(tài)

if(oldVoteCount == 1){

state= newNormalVoteState();

}else if(oldVoteCount > 1 && oldVoteCount < 5){

state= newRepeatVoteState();

}else if(oldVoteCount >= 5 && oldVoteCount <8){

state= newSpiteVoteState();

}else if(oldVoteCount > 8){

state= newBlackVoteState();

}//然后轉(zhuǎn)調(diào)狀態(tài)對(duì)象來(lái)進(jìn)行相應(yīng)的操作

state.vote(user, voteItem, this);

}

}

客戶端類

public classClient {public static voidmain(String[] args) {

VoteManager vm= newVoteManager();for(int i=0;i<9;i++){

vm.vote("u1","A");

}

}

}

運(yùn)行結(jié)果如下:

從上面的示例可以看出,狀態(tài)的轉(zhuǎn)換基本上都是內(nèi)部行為,主要在狀態(tài)模式內(nèi)部來(lái)維護(hù)。比如對(duì)于投票的人員,任何時(shí)候他的操作都是投票,但是投票管理對(duì)象的處理卻不一定一樣,會(huì)根據(jù)投票的次數(shù)來(lái)判斷狀態(tài),然后根據(jù)狀態(tài)去選擇不同的處理。

認(rèn)識(shí)狀態(tài)模式

●  狀態(tài)和行為

所謂對(duì)象的狀態(tài),通常指的就是對(duì)象實(shí)例的屬性的值;而行為指的就是對(duì)象的功能,再具體點(diǎn)說(shuō),行為大多可以對(duì)應(yīng)到方法上。

狀態(tài)模式的功能就是分離狀態(tài)的行為,通過(guò)維護(hù)狀態(tài)的變化,來(lái)調(diào)用不同狀態(tài)對(duì)應(yīng)的不同功能。也就是說(shuō),狀態(tài)和行為是相關(guān)聯(lián)的,它們的關(guān)系可以描述為:狀態(tài)決定行為。

由于狀態(tài)是在運(yùn)行期被改變的,因此行為也會(huì)在運(yùn)行期根據(jù)狀態(tài)的改變而改變。

●  行為的平行性

注意平行線而不是平等性。所謂平行性指的是各個(gè)狀態(tài)的行為所處的層次是一樣的,相互獨(dú)立的、沒有關(guān)聯(lián)的,是根據(jù)不同的狀態(tài)來(lái)決定到底走平行線的哪一條。行為是不同的,當(dāng)然對(duì)應(yīng)的實(shí)現(xiàn)也是不同的,相互之間是不可替換的。

而平等性強(qiáng)調(diào)的是可替換性,大家是同一行為的不同描述或?qū)崿F(xiàn),因此在同一個(gè)行為發(fā)生的時(shí)候,可以根據(jù)條件挑選任意一個(gè)實(shí)現(xiàn)來(lái)進(jìn)行相應(yīng)的處理。

大家可能會(huì)發(fā)現(xiàn)狀態(tài)模式的結(jié)構(gòu)和策略模式的結(jié)構(gòu)完全一樣,但是,它們的目的、實(shí)現(xiàn)、本質(zhì)卻是完全不一樣的。還有行為之間的特性也是狀態(tài)模式和策略模式一個(gè)很重要的區(qū)別,狀態(tài)模式的行為是平行性的,不可相互替換的;而策略模式的行為是平等性的,是可以相互替換的。

●   環(huán)境和狀態(tài)處理對(duì)象

在狀態(tài)模式中,環(huán)境(Context)是持有狀態(tài)的對(duì)象,但是環(huán)境(Context)自身并不處理跟狀態(tài)相關(guān)的行為,而是把處理狀態(tài)的功能委托給了狀態(tài)對(duì)應(yīng)的狀態(tài)處理類來(lái)處理。

在具體的狀態(tài)處理類中經(jīng)常需要獲取環(huán)境(Context)自身的數(shù)據(jù),甚至在必要的時(shí)候會(huì)回調(diào)環(huán)境(Context)的方法,因此,通常將環(huán)境(Context)自身當(dāng)作一個(gè)參數(shù)傳遞給具體的狀態(tài)處理類。

客戶端一般只和環(huán)境(Context)交互??蛻舳丝梢杂脿顟B(tài)對(duì)象來(lái)配置一個(gè)環(huán)境(Context),一旦配置完畢,就不再需要和狀態(tài)對(duì)象打交道了??蛻舳送ǔ2回?fù)責(zé)運(yùn)行期間狀態(tài)的維護(hù),也不負(fù)責(zé)決定后續(xù)到底使用哪一個(gè)具體的狀態(tài)處理對(duì)象。

總結(jié)

以上是生活随笔為你收集整理的java 状态模式 同步_JAVA设计模式之状态模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。