设计模式入门

最近想学设计模式,网上说 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    
    }
}

经过这几次任务,小明感觉写的代码更漂亮,更优雅了,腰也不酸了,背也不疼了。小明上交任务后,项目经理也露出了满意的笑容!

最后,小明成功通过了实习,然而项目经理给他分配了下一项任务......

原文地址:https://www.cnblogs.com/M-Anonymous/p/13171022.html