缺少抽象类的变通方式-算法分析与设计---micheal t.goodrich roberto tamassia

16.4缺少抽象类的变通方式我们看到,在状态类中将定义一些共同的行为方法,Context终会将请求委托给状态对象的这些方法,在这个例子里,这个方法就是buttonWasPressed。无论增加了多少种状态类,它们都必须实现buttonWasPressed方法。在Java中,所有的状态类必须继承自一个State抽象父类,当然如果没有共同的功能值得放入抽象父类中,也可以选择实现State接口。这样做的原因一方面是我们曾多次提过的向上转型,另一方面是保证所有的状态子类都实现了buttonWasPressed方法。遗憾的是,JavaScript既不支持抽象类,也没有接口的概念。所以在使用状态模式的时候要格外小心,如果我们编写一个状态子类时,忘记了给这个状态子类实现buttonWasPressed方法,则会在状态切换的时候抛出异常。因为Context总是把请求委托给状态对象的buttonWasPressed方法。不论怎样严格要求程序员,也许都避免不了犯错的那一天,毕竟如果没有编译器的帮助,只依靠程序员的自觉以及一点好运气,是不靠谱的。这里建议的解决方案跟《模板方法模式》中一致,让抽象父类的抽象方法直接抛出一个异常,这个异常至少会在程序运行期间就被发现: var State = function(){}; State.prototype.buttonWasPressed = function(){ throw new Error( '父类的buttonWasPressed方法必须被重写' ); }; var SuperStrongLightState = function( light ){图灵社区会员轩辕专享尊重版权
pdf 文件大小:8.11MB