Shimeji开源桌宠代码学习(2)

来源:互联网 发布:3gpp网络 编辑:程序博客网 时间:2024/06/05 05:39

在 Shimeji开源桌宠代码学习(1)中描述了整个配置文件加载的过程,其中很多地方使用了Builder这一概念,首先我们先来看看这些Builder都有什么特征,我认为我们从AnimationBuilder即最下层的Builder来看起,应该更容易找到其特点,首先是AnimationBuilder的定义,它主要有两个实例变量

private final String condition;private final List<Pose> poses = new ArrayList<Pose>();

里面使用的Pose类是这样定义的:

public class Pose {private final ImagePair image;private final int dx;private final int dy;private final int duration;public Pose(final ImagePair image) {this(image, 0, 0, 1);}public Pose(final ImagePair image, final int duration) {this(image, 0, 0, duration);}public Pose(final ImagePair image, final int dx, final int dy, final int duration) {this.image = image;this.dx = dx;this.dy = dy;this.duration = duration;}@Overridepublic String toString() {return "姿勢("+getImage()+","+getDx()+","+getDy()+","+getDuration()+")";}public void next(final Mascot mascot) {mascot.setAnchor(new Point(mascot.getAnchor().x + (mascot.isLookRight() ? -getDx() : getDx()), mascot.getAnchor().y+ getDy()));mascot.setImage(getImage().getImage(mascot.isLookRight()));}public int getDuration() {return this.duration;}public ImagePair getImage() {return this.image;}public int getDx() {return this.dx;}public int getDy() {return this.dy;}}
这里面主要抽象了一个アニメーション内一张图片的属性,也就是说,AnimationBuilder负责管理自己拥有的所有Poses,同时AnimationBuilder里面有一个AnimationBuilder::buildAnimation(),如下:

public Animation buildAnimation() throws AnimationInstantiationException {try {return new Animation(Variable.parse(this.getCondition()), this.getPoses().toArray(new Pose[0]));} catch (final VariableException e) {throw new AnimationInstantiationException("条件の評価に失敗しました", e);}}
此处将poses数组传入Animation的constructor并创建为一个Animation。这里可以看到,通过一个AnimationBuilder解决了Pose和Animation之间过于抽象的问题,成功的实现了由poses到animation的转化。类似的,整个这样的转化都有ActionBuilder统一规划,这样的好处就是如果增加、修改或删除AnimationBuilder并不会影响上层代码的逻辑,只需要对xml文件进行修改,解决了抽象内容的转化问题,同时高度抽象了整个shimeji的Action,统一对AnimationBuilder进行管理,在这里将整个shimeji的行为立体化。


其实这使用的就是建造者模式,即将一个对象的构建与它的表示分离(本例中为Animation),是的同样的构建过程能够创建不同的表示(本例中为多个AnimationBuilder)。

好处就是能够使复杂对象的构建解除耦合,即当构建shimeji行为的时候,通过使用建造者模式,我们只需要声明对应的建造者,然后仅仅根据配置文件的不同来创建不同的Animation(实际上进行的都是createAnimation过程但是结果不同)。




2 0