最近想学设计模式,网上说 HeadFirst 设计模式书挺好的,我来此再巩固一篇。
故事是这样的:小明是一个刚毕业的小伙子,他来到了一个游戏公司实习,项目经理分配了一个实习任务给小明:
设计一个游戏角色,角色属性包括(攻击力,防御力,敏捷度...等等),以及两个召唤师技能(闪现和引燃)。
小明想这么简单的吗,如是他用了一天的时间写好了如下代码
public class GameRole { private int atk; // 攻击力 private int def; // 防御力 private int dex; // 敏捷度 public void flash_move() { System.out.println("指定方向瞬移一段距离"); } public void ignite() { System.out.println("使其处于燃烧状态 5 s"); } }
项目经理看到小明这么快就完成了任务,表扬了一下小明,小明心里乐开了花。然后项目经理又布置了一项任务给小明:
再设计两个角色,他们的召唤师技能分别为(闪现,治疗),(闪现,传送)。
小明心想这难不倒我,然后他仍然只花了一天的时间就写好了如下代码:
public class GameRole { private int atk; // 攻击力 private int def; // 防御力 private int dex; // 敏捷度 public void flash_move() { System.out.println("指定方向瞬移一段距离"); } public void ignite() { System.out.println("使附近100码内队友恢复30%的血量"); } } public class GameRole { private int atk; // 攻击力 private int def; // 防御力 private int dex; // 敏捷度 public void flash_move() { System.out.println("指定方向瞬移一段距离"); } public void ignite() { System.out.println("传送至己方非英雄单位位置处"); } }
小明兴高采烈的跑去给项目经理看了,项目经理看到小明过来了,心里觉得这小伙子不错麻,这么快就做完了。
然后项目经理便看了他的代码,这不看不要紧,一看便指着小明骂道:你真是一个糟糕的程序员!!!然后便让小明改代码去了。
小明此时还不太明白,我功能都实现了啊,没啥毛病阿,然后小明不明所以的便问了办公室的职员,职员告诉他,你代码冗余度太高了。
小明一看发现果然如此,然后便花了一天的时间改成如下代码:
public abstract class GameRole { private int atk; // 攻击力 private int def; // 防御力 private int dex; // 敏捷度
// 省略 Getter and Setter method public void flash_move() { System.out.println("指定方向瞬移一段距离"); } public abstract void skill(); }
public class Role_One extends GameRole { @Override public void skill() { // TODO Auto-generated method stub System.out.println("使其处于燃烧状态 5 s"); } }
public class Role_Two extends GameRole { @Override public void skill() { // TODO Auto-generated method stub System.out.println("使附近100码内队友恢复30%的血量"); } }
public class Role_Three extends GameRole { @Override public void skill() { // TODO Auto-generated method stub System.out.println("传送至己方非英雄单位位置处"); } }
这次小明觉得冗余度确实降低了,然后便给项目经理看,项目经理看后觉得确实还行,便又分配了一个任务:
(游戏用户希望能自由选择召唤师技能就好了),所以任务是召唤师技能任意搭配。
小明心想:我写的这种代码似乎不用改耶,可以交差了,于是小明便偷懒了两天,然后便上报给项目经理了。
项目经理一看,这代码没有变化啊,便问小明,你代码就这?小明回答是的,然后小明又被骂的狗血淋头。
不明所以的小明又去问问办公室的职员,你仔细想想,如果有100个(闪现,引燃),100个(闪现,治疗),100个(传送,治疗)呢?
小明突然恍然大悟,那还是有好高的冗余度啊,经过三天思考后,小明想出了最终答案:
public abstract class GameRole {
private int atk; // 攻击力 private int def; // 防御力 private int dex; // 敏捷度 private Skills skill_One; private Skills skill_Two;
// 省略 Getter and Setter method } public class Role_Demo extends GameRole { }
public interface Skills { public void skill(); } public class Flush_Move implements Skills { @Override public void skill() { // TODO Auto-generated method stub System.out.println("指定方向瞬移一段距离"); } } public class Ignite implements Skills { @Override public void skill() { // TODO Auto-generated method stub System.out.println("使其处于燃烧状态 5 s"); } } public class Treat implements Skills { @Override public void skill() { // TODO Auto-generated method stub System.out.println("使附近100码内队友恢复30%的血量"); } }
public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Role_Demo role = new Role_Demo(); role.setSkill_One(new Flush_Move()); role.setSkill_Two(new Ignite()); role.getSkill_One().skill(); role.getSkill_Two().skill(); } }
小明写完了,这次小明怕又被骂,便去问问职员小花了,小花说写的不错吗,于是小明胆战心惊的去交差了。
项目经理看到小明过来,看着小明的囧样,内心是想笑的,然后看了看代码发现这回没啥问题了,便放心的交给它最后一个任务:
给每个英雄添加四个不相同的技能:
小明经过几次写代码的经历后,一天便写出来了:
public abstract class GameRole { private int atk; // 攻击力 private int def; // 防御力 private int dex; // 敏捷度 private Skills skill_One; private Skills skill_Two; // 省略 Getter and Setter method public abstract void Skill_One(); public abstract void Skill_Two(); public abstract void Skill_Three(); public abstract void Skill_Four(); } public class Role_Demo extends GameRole { @Override public void Skill_One() { // TODO Auto-generated method stub } @Override public void Skill_Two() { // TODO Auto-generated method stub } @Override public void Skill_Three() { // TODO Auto-generated method stub } @Override public void Skill_Four() { // TODO Auto-generated method stub } }
经过这几次任务,小明感觉写的代码更漂亮,更优雅了,腰也不酸了,背也不疼了。小明上交任务后,项目经理也露出了满意的笑容!
最后,小明成功通过了实习,然而项目经理给他分配了下一项任务......