42. 互換性担保のための
共通インターフェースを定義
public abstract class ViewAnimator {
public ViewAnimator(int from, int to) {
...
}
public abstract void setDuration(long duration);
public abstract void setInterpolator(Interpolator i);
public abstract void start();
}
43. 各サブクラスは
複数ではなく単一責務を負う
public class OldViewAnimator extends ViewAnimator {
private Animation mAnimation;
private View mView;
...
@Override
public void setDuration(long duration) {
mAnimation.setDuration(duration);
}
@Override
public void setInterpolator(Interpolator i) {
mAnimation.setInterpolator(i);
}
@Override
public void start() {
mView.startAnimation(mAnimation);
}
}
44. public class NewViewAnimator extends ViewAnimator {
private Animator mAnimator;
private View mView;
...
@Override
public void setDuration(long duration) {
mAnimator.setDuration(duration);
}
@Override
public void setInterpolator(Interpolator i) {
mAnimator.setInterpolator(i);
}
@Override
public void start() {
mAnimator.start();
}
}
各サブクラスは
複数ではなく単一責務を負う
45. public static ViewAnimator create(int version,
int from, int to) {
if (version < Build.VERSION_CODES.HONEYCOMB) {
return new OldViewAnimator(from, to);
} else {
return new NewViewAnimator(from, to);
}
}
インスタンスの生成は
Factory methodで隠蔽
53. public class RefreshCommand implements Command {
@Override
public boolean execute() {
...
return true;
}
}
処理ごとに
サブクラスを作成
54. mCommands = new SparseArray<>();
mCommands.append(
R.id.action_edit, new EditCommand());
mCommands.append(
R.id.action_delete, new DeleteCommand());
mCommands.append(
R.id.action_clear, new ClearCommand());
mCommands.append(
R.id.action_refresh, new RefreshCommand());
コマンドの識別子がキーの
コマンドマップを定義
55. @Override
public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId();
Command command = mCommands.get(
itemId, new NullCommand());
return command.execute(getApplicationContext());
}
コマンドマップから
コマンドを引き当てて実行