国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 23種設計模式(22)java狀態模式

23種設計模式(22)java狀態模式

2021-03-27 14:06小呂-ICE Java教程

這篇文章主要為大家詳細介紹了23種設計模式之java狀態模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、概述

當系統中某個對象存在多個狀態,這些狀態之間可以進行轉換,而且對象在不同狀態下行為不相同時可以使用狀態模式。狀態模式將一個對象的狀態從該對象中分離出來,封裝到專門的狀態類中,使得對象狀態可以靈活變化。狀態模式是一種對象行為型模式。

二、適用場景

用于解決系統中復雜對象的多種狀態轉換以及不同狀態下行為的封裝問題。簡單說就是處理對象的多種狀態及其相互轉換。

三、uml類圖

23種設計模式(22)java狀態模式

四、參與者

1)、abstractstate(抽象狀態類):

        在抽象狀態類中定義申明了不同狀態下的行為抽象方法,而由子類(不同的狀態子類)中實現不同的行為操作。

2)、concretestate(實現具體狀態下行為的狀態子類):

        抽象狀態類的子類,每一個子類實現一個與環境類(context)的一個狀態相關的行為,每一個具體的狀態類對應環境的一種具體狀態,不同的具體狀態其行為有所不同。

3)、context(擁有狀態對象的環境類):

        擁有狀態屬性,因環境的多樣性,它可擁有不同的狀態,且在不同狀態下行為也不一樣。在環境類中維護一個抽象的狀態實例,這個實例定義當前環境的狀態(setstate()方法),而將具體的狀態行為分離出來由不同的狀態子類去完成。

五、用例學習

1、抽象狀態類:state.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* java設計模式之 狀態模式
* 抽象狀態類
* @author lvzb.software@qq.com
*
*/
public abstract class state {
  /**
  * 狀態行為抽象方法,由具體的狀態子類去實現不同的行為邏輯
  */
  public abstract void behavior();
 
}

2、具體狀態子類a:concretestatea.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 具體的狀態子類a
* @author lvzb.software@qq.com
*/
public class concretestatea extends state {
 
  @override
  public void behavior() {
    // 狀態a 的業務行為, 及當為該狀態下時,能干什么 
    // 如:手機在未欠費停機狀態下, 能正常撥打電話
    system.out.println("手機在未欠費停機狀態下, 能正常撥打電話");
  }
 
}

3、具體狀態子類b:concretestateb.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 具體的狀態子類b
* @author lvzb.software@qq.com
*
*/
public class concretestateb extends state {
 
  @override
  public void behavior() {
    // 狀態b 的業務行為, 及當為該狀態下時,能干什么
    // 如:手機在欠費停機狀態下, 不 能撥打電話
    system.out.println("手機在欠費停機狀態下, 不能撥打電話");
  }
 
}

4、擁有狀態對象的環境類:context.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/**
* 環境/上下文類<br/>
* 擁有狀態對象,且可以完成狀態間的轉換 [狀態的改變/切換 在環境類中實現]
* @author lvzb.software@qq.com
*
*/
public class context {
  // 維護一個抽象狀態對象的引用
  private state state;
   
  /*
  * 模擬手機的話費屬性<br/>
  * 環境狀態如下:
  * 1>、當 bill >= 0.00$ : 狀態正常  還能撥打電話
  * 2>、當 bill < 0.00$ : 手機欠費  不能撥打電話
  */
  private double bill;
   
  /**
  * 環境處理函數,調用狀態實例行為 完成業務邏輯<br/>
  * 根據不同的狀態實例引用 在不同狀態下處理不同的行為
  */
  public void handle(){
    checkstate();
    state.behavior();
  }
   
   
  /**
  * 檢查環境狀態:狀態的改變/切換 在環境類中實現
  */
  private void checkstate(){
    if(bill >= 0.00){
      setstate(new concretestatea());
    } else {
      setstate(new concretestateb());
    }
  }
   
   
  /**
  * 設置環境狀態<br/>
  * 私有方法,目的是 讓環境的狀態由系統環境自身來控制/切換,外部使用者無需關心環境內部的狀態
  * @param state
  */
  private void setstate(state state){
    this.state = state;
  }
 
 
  public double getbill() {
    return bill;
  }
 
  public void setbill(double bill) {
    this.bill = bill;
  }
}

5、測試客戶端調用類:client.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class client {
 
  public static void main(string[] args) {
    context context = new context();
    context.setbill(5.50);
    system.out.println("當前話費余額:" + context.getbill() + "$");
    context.handle();
     
    context.setbill(-1.50);
    system.out.println("當前話費余額:" + context.getbill() + "$");
    context.handle();
     
    context.setbill(50.00);
    system.out.println("當前話費余額:" + context.getbill() + "$");
    context.handle();
  }
}

6、程序運行結果:

當前話費余額:5.5$ 
手機在未欠費停機狀態下, 能正常撥打電話 
當前話費余額:-1.5$ 
手機在欠費停機狀態下, 不能撥打電話 
當前話費余額:50.0$ 
手機在未欠費停機狀態下, 能正常撥打電話

六、擴展 

狀態模式中 關于狀態的切換有兩種不同的實現方式

方式一:狀態的改變/切換  在環境類中實現。  如上面的用例代碼context類中的checkstate()方法。

?
1
2
3
4
5
6
7
8
9
10
/**
  * 檢查環境狀態:狀態的改變/切換 在環境類中實現
  */
  private void checkstate(){
    if(bill >= 0.00){
      setstate(new concretestatea());
    } else {
      setstate(new concretestateb());
    }
  }

方式二:狀態的改變/切換  在具體的狀態子類中實現。

實現步驟如下:

1)、在環境類context類中 初始化一個狀態實例對象,并將環境context對象作為子類狀態的構造參數傳遞到具體的狀態子類實例中。

如在context.java類中

?
1
2
// 設置初始狀態
this.state = new concretestatea(this);

2)、 在具體的子類狀態類中根據構造進來的context對象,通過調用context對象的屬性值進行業務邏輯判斷 進行狀態的檢查和切換。

如在 具體的狀態子類concretestatea.java類中:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
* 具體的狀態子類a
* @author lvzb.software@qq.com
*/
public class concretestatea extends state {
  private context ctx;
   
  public concretestatea(context context){
    ctx = context;
  }
   
  @override
  public void behavior() {
    // 狀態a 的業務行為, 及當為該狀態下時,能干什么 
    // 如:手機在未欠費停機狀態下, 能正常撥打電話
    system.out.println("手機在未欠費停機狀態下, 能正常撥打電話");
    checkstate();
     
  }
 
  /**
  * 檢查狀態 是否需要進行狀態的轉換<br/>
  * 狀態的切換由具體狀態子類中實現
  */
  private void checkstate(){
    if (ctx.getbill() < 0.00) {
      ctx.setstate(new concretestateb(ctx));
    }
  }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/janice0529/article/details/41054673

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 天天操天天干视频 | 国产三级久久久久 | 婷婷激情五月 | 精品久久久久久久久久久久 | 国产成人一区二区三区在线观看 | 中文成人在线 | 亚洲精品第一 | 精品99在线 | 日韩一区在线视频 | 国产成人精品免高潮在线观看 | 亚洲精品久久久 | 国产精品com | 精品日韩一区 | 国产精品美女久久久久久久久久久 | 一区二区免费看 | 国产一区二区三区免费 | 欧美一区二区二区 | 亚洲精品偷拍自拍 | 日韩大片| 亚洲精品一 | 中文字幕在线观看日韩 | 亚洲一区二区三区免费视频 | 激情中文网 | 日本成人片网站 | 五月天狠狠爱 | 国产精品免费精品自在线观看 | 成人精品视频在线观看 | 日韩精品一区二区三区免费视频 | 91 在线免费观看 | 久久精品免费一区二区三区 | 狠狠操夜夜操 | 99热在线观看免费 | 亚洲三区在线观看 | 久久中文字幕一区 | 天堂va久久久噜噜噜久久va | 成人午夜影视 | 国产一区二区三区视频 | 青青草91在线视频 | 一区二区在线免费观看 | 黄色片视频在线观看免费 | 欧美在线不卡视频 |