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
- Shimeji开源桌宠代码学习(2)
- Shimeji开源桌宠代码学习(1)
- Shimeji开源桌宠代码学习(3)
- 第一行代码学习2(2)
- 基础学习笔记 + 代码实例 (2)
- C#代码优化学习总结(2)
- srs代码学习(2)- 线程模型
- 第一行代码学习2(1)
- 第一行代码学习2(3)
- 第一行代码学习2(4)
- 第一行代码学习2(5)
- 第一行代码学习2(6)
- 第一行代码学习2(7)
- srs代码学习(2)- 线程模型
- 代码大全学习-2
- Love2D学习 - 代码2
- 学习改造代码2
- Java学习【代码2】
- 异常
- Ubuntu 16.04网速慢解决方法
- Android 自带的DownloadManager 在Service 中下载 apk 安装
- Ural1118-Nontrivial Numbers
- MVC笔记 Controller相关技术
- Shimeji开源桌宠代码学习(2)
- 明年大数据行业的趋势会是哪些?
- 学习记录:python serial 库&excel操作
- RecyclerView 以及 ItemClickListener的实现
- 423_获取TextView的行数
- 【LeetCode】67. Add Binary
- 有关远程ssh操作
- 424_模仿微信提示dialog
- android 自定义View implements OnClickListener