java继承层次结构,在状态模式中实现继承层次结构 - java

我有一个与此非常相似的设计:

这里的NewOrder,Registered&Granted都有通用方法AddOrderline()和Cancel(),因此将这两种方法重构为父类很容易。

当我要Cancel一条Shipped行(当前未在图中显示)时,会出现问题。

由于发运行不支持AddOrderline(),因此我需要将NewOrder的父类打破,将已注册并授予的类分为2类,一类用于Cancel(),另一类用于AddOrderline()。

现在NewOrder必须扩展2个父类才能获得2个函数。

笔记

这个例子非常简化。我的实际应用程序大约有12个状态。

该代码使用PHP,但是欢迎使用C#或Java解决方案,因为我认为该解决方案将是相似的,因为它们都不支持多重继承。

java参考方案

我会考虑将接口与实现分开。例如在Java中

interface Cancellable {

void cancel();

}

interface Shippable{

void ship();

}

等等

public class NewState implements Cancellable, Shippable {

public void cancel() { ... }

public void ship() { ... }

}

如果您有一个基础私有国家,则它可以实现所有必需的接口,而您的公共国家只需要委派那些受支持的国家即可。例如

public class UnderlyingState implements Cancellable, Shippable ... {

public void cancel() { ... }

public void ship() { ... }

}

public class ShippableState implements Shippable {

private UnderlyingState ustate = new UnderlyingState();

public void cancel() {

// you can *only* cancel this

ustate.cancel();

}

}

在上面,您可能需要返回一个新的状态对象(而不是void),并让您的Order采用该新状态。 UnderlyingState对象将强制执行某些状态机。

令人头疼的是,随着状态数量的增加,接口和实现也随之增加。

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…从方法返回数组-Java - java

private static Coordinate[] getCircleCoordintaes() { Coordinate coordinates[] = {new Coordinate(0, 0)}; return coordinates; } 以上程序工作正常。在上面的程序中,返回的坐标数组首先初始化了数组使用这条线Coordinate coordi…Java Swing SearchBox模型 - java

我需要使用Java Swing的搜索框,如果单击任何建议,当输入字母时它将显示来自数据库的建议,它将执行一些操作。如果有可能在Java swing中,请提供源代码提前致谢 java大神给出的解决方案 您可以使用DefaultComboBoxModel,输出将是这样。Try this在此代码中,您将找到countries数组,因此您需要从数据库中获取此数组。JAVA:如何检查对象数组中的所有对象是否都是子类的对象? - java

我有一个对象数组。现在,我要检查所有这些对象是否都是MyObject的实例。有没有比这更好的选择:boolean check = true; for (Object o : justAList){ if (!(o instanceof MyObject)){ check = false; break; } } java大神给出的解决方案 如果您不喜欢循环,则…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值