网上有很多关于使用面向对象模式的文章和视频。如果您找不到一个真正好的示例,那么就很难真正理解它。当我和我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
结论
如果有很多状态需要处理,并且它们之间有一些复杂的关系,那么状态模式就是正确的解决方案。它会让你的主类(在我们这个例子中是自行车,)专注于实现自己职责的工作。如果您想添加或删除新状态,会很容易而且不影响其它类。