網上有很多關於使用面向對象模式的文章和視頻。如果您找不到一個真正好的示例,那麼就很難真正理解它。當我和我8歲的兒子一起騎自行車時,我總是提醒他在騎上坡時加速,在騎平坡或下坡時要減速。這種傳動裝置機制是解釋如何使用狀態模式的一個很好的例子。在本教程中,我將通過一個騎自行車的示例演示State Patterns(狀態設計模式)。我希望它能與你的學習方式產生共鳴,記住它,以供以後參考。
首先,我需要一個自行車類。這應該很簡單:
public class Bike {
GearState gearState;
public Bike(){
gearState = new FirstGear(this);
}
public void gearUp(){
gearState.gearUp();
}
public void gearDown(){
gearState.gearDown();
}
}
我一直在儘可能簡單的自行車類。上面的Bike類是使用State模式實現的。只要您能夠使用許多“如果”或“切換”條件,就可以在其中使用所有與狀態相關的齒輪代碼。如果有許多狀態,則很難維持後者。如果您需要維護一些狀態,那麼狀態模式將使您的設計複雜化。
正如您在上面的代碼中看到的,我們有GearState,它只是一個抽象類,您將在下面看到完整的代碼。這輛自行車可以從GearState擴展開來,但這並不是“Is A”關係。這就是為什麼我沒有擴展,因為在狀態模式中,擴展狀態接口不是一種常見的實踐。
public abstract class GearState {
Bike bike;
GearState(Bike bike){
this.bike = bike;
}
public abstract void gearUp();
public abstract void gearDown();
}
一輛變速自行車可以有很多齒輪,但是為了簡單起見,這輛自行車只有三個齒輪:FirstGear , SecondGear , 和 ThirdGear 。下面是gears的實現:
class FirstGear extends GearState{
FirstGear(Bike bike) {
super(bike);
}
@Override
public void gearUp() {
System.out.println("Moving Up from FirstGear to SecondGear");
bike.gearState = new SecondGear(bike);
}
@Override
public void gearDown() {
System.out.println("Already in the FirstGear - cannot go lower");
}
}
如果你嘗試減速,當你在第一個齒輪(FirstGear),你沒有低於第一個齒輪。因此,它什麼都不做。但是,當你試著加速時,自然地,你會移動到第二個齒輪位置(SecondGear)。下面的代碼很好地演示了這一點。
讓我們看看其他的齒輪狀態。
class SecondGear extends GearState{
SecondGear(Bike bike) {
super(bike);
}
@Override
public void gearUp() {
System.out.println("Moving Up from SecondGear to ThirdGear");
bike.gearState = new ThirdGear(bike);
}
@Override
public void gearDown() {
System.out.println("Moving Down from SecondGear to FirstGear");
bike.gearState = new FirstGear(bike);
}
}
class ThirdGear extends GearState {
public ThirdGear(Bike bike) {
super(bike);
}
@Override
public void gearUp() {
System.out.println("Already in the ThirdGear - cannot go higher");
}
@Override
public void gearDown() {
System.out.println("Moving Down from ThirdGear to SecondGear");
bike.gearState = new SecondGear(bike);
}
}
現在,是時候看到它運行了。
下面是演示不同狀態變化的示例方法。
public class StateDemo {
public static void main(String[] args) {
Bike bike = new Bike();
bike.gearDown();
bike.gearUp();
bike.gearUp();
bike.gearUp();
bike.gearUp();
bike.gearDown();
bike.gearDown();
bike.gearDown();
}
}
當您運行上面的代碼時,控制檯輸出如下:
Already in the FirstGear — cannot go lower Moving Up from FirstGear to SecondGear Moving Up from SecondGear to ThirdGear Already in the ThirdGear — cannot go higher Already in the ThirdGear — cannot go higher Moving Down from ThirdGear to SecondGear Moving Down from SecondGear to FirstGear Already in the FirstGear — cannot go lower
結論
如果有很多狀態需要處理,並且它們之間有一些複雜的關係,那麼狀態模式就是正確的解決方案。它會讓你的主類(在我們這個例子中是自行車,)專注於實現自己職責的工作。如果您想添加或刪除新狀態,會很容易而且不影響其它類。