zoukankan      html  css  js  c++  java
  • 设计模式入门

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

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

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

  • 相关阅读:
    fedora中将程序的快捷方式添加到“应用程序”中的方法
    Windows PHP 中 VC6 X86 和 VC9 X86 的区别及 Non Thread Safe 的意思
    Fedora/Centos升级Python由2.7到3.2
    MVC模式小结
    使用MVVM模式的WPF应用(翻译文章)
    WPF的数据绑定
    关于cookie、session、application知识 的整理
    C#中关于Module和Assembly的关系
    c#接口和抽象类的一些概念
    23种设计模式(超级简洁)
  • 原文地址:https://www.cnblogs.com/M-Anonymous/p/13171022.html
Copyright © 2011-2022 走看看