面向對象設計模式:Java中的狀態模式代碼示例

面向對象設計模式:Java中的狀態模式代碼示例

面向對象設計模式:Java中的狀態模式代碼示例

網上有很多關於使用面向對象模式的文章和視頻。如果您找不到一個真正好的示例,那麼就很難真正理解它。當我和我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

結論

如果有很多狀態需要處理,並且它們之間有一些複雜的關係,那麼狀態模式就是正確的解決方案。它會讓你的主類(在我們這個例子中是自行車,)專注於實現自己職責的工作。如果您想添加或刪除新狀態,會很容易而且不影響其它類。


分享到:


相關文章: