請在后臺配置參數,參數名稱:topads
編程語言 php java

java設計模式-狀態模式State

java HTML我幫您 1年前  5285次瀏覽
定義:允許一個對象的內部狀態改變時改變它的行為。對象看起來似乎修改了它的類。在狀態模式中,我們創建代表多個狀態的對象和一個上下文對象,這個上下文對象的行為隨著狀態對象的變化而變化。

本質:根據狀態來分離和選擇行為。

狀態:對象實例的屬性值。

行為:對象的功能,大多對應到方法上。

狀態模式的功能:分離狀態的行為,通過維護狀態的變化,來調用不同裝態對應的不同功能。

狀態和行為是相關聯的,可以描述為:狀態決定行為。

狀態模式和策略模式的結構師完全一樣的,但它們的目的、實現、本質卻完全不一樣。狀態模式的行為是平行的,不可相互替換的;而策略模式的行為是平等性的,是可以相互替換的。

Context :環境,也稱為上下文,用來定義客戶感興趣的接口,同時維護一個具體處理當前狀態的實例對象。
State:狀態接口,用來封裝與上下文的一個特定狀態所對應的行為。
ConcreteState:具體實現狀態的處理類,每個實現一個跟上下文相關聯的狀態的具體處理。

狀態處理對象的創建和銷毀:
① 當需要使用狀態對象的時候創建,使用完后就銷毀。
② 提前創建它們并永不銷毀(單例)。
③ 采用延時加載 + 緩存的方式。就是當第一次使用的時候創建,使用完后并不銷毀而是把它緩存起來,下一次使用時,從緩存中獲取對象,并由緩存框架來銷毀狀態處理對象。

狀態的維護和轉換:維護狀態的數據,給狀態設置不同的狀態值;狀態的轉換,指的是根據狀態的變化來選擇不同的狀態處理對象。

以開關燈為例:
package com.html580.state;

class Context {
private State state;

public Context() {
state = null;
}

public void setState(State state) {
this.state = state;
}

public State getState() {
return state;
}
}

interface State {
public void doAction(Context context);
}

class OnState implements State {
public void doAction(Context context) {
System.out.println("正在開燈");
context.setState(this);
}

public String toString() {
return "燈是亮著的";
}
}

class OffState implements State {
public void doAction(Context context) {
System.out.println("正在關燈");
context.setState(this);
}

public String toString() {
return "燈是關著的";
}
}

public class Client {
public static void main(String<> args) {
Context context = new Context();
OnState onState = new OnState();
onState.doAction(context);
System.out.println(context.getState().toString());
OffState stopState = new OffState();
stopState.doAction(context);
System.out.println(context.getState().toString());
}
}
輸出結果:
正在開燈
燈是亮著的
正在關燈
燈是關著的







發表評論

2017怎样手机上赚钱 湖南体彩幸运赛车开奖 河北11选5一定牛任5遗漏 浙江省2004体彩6+1 浙江11选5奖金对照表 排列5 海南体彩4 1 甘肃兰州快3走势图今天 怎么玩股票的 河北排列7开奖查询 重庆幸运农场计划软件 天津11选5号码定位走势图