前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面向对象设计模式:Java中的状态模式代码示例

面向对象设计模式:Java中的状态模式代码示例

作者头像
程序你好
发布2018-08-09 15:28:03
8280
发布2018-08-09 15:28:03
举报
文章被收录于专栏:程序你好程序你好

网上有很多关于使用面向对象模式的文章和视频。如果您找不到一个真正好的示例,那么就很难真正理解它。当我和我8岁的儿子一起骑自行车时,我总是提醒他在骑上坡时加速,在骑平坡或下坡时要减速。这种传动装置机制是解释如何使用状态模式的一个很好的例子。在本教程中,我将通过一个骑自行车的示例演示State Patterns(状态设计模式)。我希望它能与你的学习方式产生共鸣,记住它,以供以后参考。

首先,我需要一个自行车类。这应该很简单:

代码语言:javascript
复制
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”关系。这就是为什么我没有扩展,因为在状态模式中,扩展状态接口不是一种常见的实践。

代码语言:javascript
复制
public abstract class GearState {
Bike bike;
GearState(Bike bike){
this.bike = bike;
}
public abstract void gearUp();
public abstract void gearDown();
}

一辆变速自行车可以有很多齿轮,但是为了简单起见,这辆自行车只有三个齿轮:FirstGear , SecondGear , 和 ThirdGear 。下面是gears的实现:

代码语言:javascript
复制
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)。下面的代码很好地演示了这一点。

让我们看看其他的齿轮状态。

代码语言:javascript
复制
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);
}
}

现在,是时候看到它运行了。

下面是演示不同状态变化的示例方法。

代码语言:javascript
复制
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

结论

如果有很多状态需要处理,并且它们之间有一些复杂的关系,那么状态模式就是正确的解决方案。它会让你的主类(在我们这个例子中是自行车,)专注于实现自己职责的工作。如果您想添加或删除新状态,会很容易而且不影响其它类。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-08-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序你好 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档