代理模式:proxy pattern
备注:下文适合看过《海贼王》的人阅读,没看过海贼王的观众请在父母陪同下阅读
状态模式:state pattern
在状态模式的设计方案里,一个主类(称为context类),可以在内部状态变化的时候一次性改变它的「所有行为」,而这个「所有行为」会被我们聚合到不同的类(state1,state2,state3)里面去。
这个内部状态我们可以理解为一个可以手动设置的state变量,设置它可以让context内部的state1切换为state2,或者是从state2切换为state3。
这么做,相比起传统的代码逻辑会发生什么变化呢?在传统的代码里,我们可能会在每个方法下,都写一大段if-else的状态判断逻辑里,然后对不同状态分别做处理,这个时候代码非常松散,不利于阅读和扩展,所以我们选择以「状态」为依据, 把这些if-else的每一部分都「聚合」到不同的状态(不同的state类)里面去,然后通过一个主类(context),去统一维护和管理。这样,逻辑上就清晰了很多,也大大降低了维护和扩展的难度。
Example
草帽路飞,是热血漫《海贼王》的主角,像其他许多同类型的作品一样,主角有自己不同层次战斗的状态,进化过程如下所示
二档:加速血液的流动,大幅提高速度和身体强度,代表大招是「橡胶Jet火箭炮」(拳)和 「橡胶Jet」(踢)
三档:向橡胶的身体吹入空气,使身体变成巨人,攻击力大增。代表大招是「橡胶巨人火箭炮」(拳)和「橡胶巨人战斧」(踢)
四档:将武装色霸气和橡胶果实融合,攻击和速度再次强化,代表大招是「橡胶狮子火箭炮」(拳)和「橡胶犀牛榴弹炮」(踢)
下图描述的是主角路飞初次进化为「二档」的历史性时刻
我们发现,主角路飞拥有不同的战斗状态:二档,三档,四档,并且大招的使用是类似的,无非就是用拳头还是用脚踢的问题,但是攻击力和招式上都不同,我们可以根据这个状态的统一性抽象一个state接口出来:
public interface State { // 拳打 public void punch (); // 脚踢 public void kick (); }