UML關(guān)系簡單介紹
UML簡單使用的介紹
創(chuàng)建型設(shè)計模式
Android設(shè)計模式-單例模式
Android設(shè)計模式-工廠模式
Android設(shè)計模式-抽象工廠模式
Android設(shè)計模式-建造者模式
Android設(shè)計模式-原型模式
結(jié)構(gòu)型設(shè)計模式
Android設(shè)計模式-代理模式
Android設(shè)計模式-裝飾模式
Android設(shè)計模式-適配器模式
Android設(shè)計模式-組合模式
Android設(shè)計模式-門面模式
Android設(shè)計模式-橋接模式
Android設(shè)計模式-享元模式
行為型設(shè)計模式
Android設(shè)計模式-策略模式
Android設(shè)計模式-命令模式
Android設(shè)計模式-責(zé)任鏈模式
Android設(shè)計模式-模版方法模式
Android設(shè)計模式-迭代器模式
Android設(shè)計模式-觀察者模式
Android設(shè)計模式-備忘錄模式
Android設(shè)計模式-中介者模式
Android設(shè)計模式-訪問者模式
Android設(shè)計模式-狀態(tài)模式
Android設(shè)計模式-解釋器模式
1.定義
當(dāng)一個對象內(nèi)在狀態(tài)改變時允許其改變行為攘蔽,這個對象看起來像改變了其類旧蛾。
2.狀態(tài)模式UML圖
角色介紹
- Context 環(huán)境角色仙辟,定義客戶端需要的接口,并且負(fù)責(zé)具體狀態(tài)的切換沙兰。
- State 抽象狀態(tài)角色 接口或者抽象類槐臀,負(fù)責(zé)對象狀態(tài)行為的定義。
- ConcreteState 具體狀態(tài)角色了袁,定義了具體狀態(tài)的不同行為,以及本狀態(tài)如何過度到另一個狀態(tài)湿颅。
3.簡單實現(xiàn)
3.1抽象狀態(tài)角色
public abstract class State {
protected Context context;
public void setContext(Context context) {
this.context = context;
}
public abstract void m1();
public abstract void m2();
}
3.2具體狀態(tài)角色
public class ConcreteState1 extends State {
@Override
public void m1() {
System.out.println("狀態(tài)1的方法1");
super.context.setCurrentState(Context.STATE2);
}
@Override
public void m2() {
System.out.println("狀態(tài)1的方法2");
}
}
public class ConcreteState2 extends State {
@Override
public void m1() {
System.out.println("狀態(tài)2的方法1");
}
@Override
public void m2() {
System.out.println("狀態(tài)2的方法2");
super.context.setCurrentState(Context.STATE1);
}
}
3.3環(huán)境角色
public class Context {
public final static State STATE1 = new ConcreteState1();
public final static State STATE2 = new ConcreteState2();
private State currentState;
public void setCurrentState(State currentState) {
this.currentState = currentState;
this.currentState.setContext(this);
}
public State getCurrentState() {
return currentState;
}
public void m1() {
currentState.m1();
}
public void m2() {
currentState.m2();
}
}
環(huán)境角色有兩個不成文的規(guī)定
- 把狀態(tài)角色聲明為靜態(tài)常量早像,有幾個狀態(tài)對象,就聲明幾個靜態(tài)常量肖爵。
- 環(huán)境角色具有狀態(tài)抽象角色定義的所有行為卢鹦,具體執(zhí)行使用委托方式。
3.4 場景調(diào)用
public class MyClass {
public static void main(String args[]) {
Context context=new Context();
context.setCurrentState(Context.STATE2);
context.m1();
context.m2();
context.m1();
context.m2();
}
}
打印結(jié)果為
狀態(tài)2的方法1
狀態(tài)2的方法2
狀態(tài)1的方法1
狀態(tài)2的方法2
此模式尤其適用于那種根據(jù)不同狀態(tài)或者類別進(jìn)行大量if-else判斷的場景劝堪。
4.總結(jié)
優(yōu)點
- 結(jié)構(gòu)清晰
- 封裝性很好
- 避免代碼膨脹的同時也保證了可擴展性和維護(hù)性
缺點
- 狀態(tài)模式的使用冀自,必然會增加賊多狀態(tài)類0.0
使用場景
- 行為隨狀態(tài)改變而變化的場景
- 條件、分支判斷語句的替代者