JAVA 封装 练习案例-王者荣耀英雄

说明

通过 王者荣耀 游戏,说明封装的重要性

有bug版本

亚瑟类

有血量

package p8_1;

//亚瑟
public class Yase {

    int hp = 1000;


}

貂蝉类

可以治愈 亚瑟

package p8_1;


//貂蝉,有治愈技能
public class Diaochan {

    public void cure(Yase yase){
        // 每次治愈200点血
        int hp = yase.hp+200;

        yase.hp = hp;
    }
}

启动类

package p8_1;

public class Bootstrap {

    public static void main(String[] args) {
        Diaochan diaochan = new Diaochan();
        Yase yase = new Yase();

        System.out.println("亚瑟的初始血量:"+yase.hp);

        diaochan.cure(yase);

        System.out.println("亚瑟出场后治愈后的血量:"+yase.hp);

    }
}

满血情况下,继续治愈,血量超出最大值
被攻击时,也可能会出现负数

封装后

亚瑟类

//亚瑟
public class Yase {

    /*
     * 类似 hp就应该定义private,不让外部类直接访问、修改
     * 原因:hp有最大值、每个英雄血量不同,也不能是负数
     * 
     * 所以:通过 setHp进行修改
     * 血量的初始值为1000 
     */
    private int hp = 1100;

    public int getHp() {
        return hp;
    }

    public void setHp(int hp) {
        //set() 方法的重要性,可以做校验
        //当血量是负数时,血量就是0
        if( hp<0){
            hp = 0;
        }else if(hp>1100){//当血量大于1000时,血量就是1000
            hp = 1100;
        }
        this.hp = hp;
    }


}

貂蝉类

package p8;

//貂蝉,有治愈技能
public class Diaochan {

    public void cure(Yase yase){
        // 每次治愈200点血
        int hp = yase.getHp()+200;

        yase.setHp(hp);
    }
}

启动类

package p8;

public class Bootstrap {

    public static void main(String[] args) {
        Diaochan diaochan = new Diaochan();
        Yase yase = new Yase();

        System.out.println("亚瑟的初始血量:"+yase.getHp());

        diaochan.cure(yase);

        System.out.println("亚瑟出场后治愈后的血量:"+yase.getHp());

    }
}

亚瑟类的问题

产品经理为了游戏的平衡性,会频繁要求修改 亚瑟 的最大血量,如:修改为 110012001250时,我们每次都要修改 3 处代码

问题: 频繁改动这三处,当工作忙碌时,很有可能忘记修改某一处代码,导致错误

如下:

package p8;

//亚瑟
public class Yase {

    private int hp = 1500; // ============只修改初始值

    public int getHp() {
        return hp;
    }

    public void setHp(int hp) {
        if( hp<0){
            hp = 0;
        }else if(hp>1100){//=============忘记修改这里
            hp = 1100;//=============忘记修改这里
        }
        this.hp = hp;
    }


}

优化亚瑟类

定义最大血量的变量,其他位置都用该变量

package p8;

//亚瑟
public class Yase {
    //定义最大血量的变量
    private int maxHP = 1250;

    private int hp = maxHP;//=======这里使用变量

    public int getHp() {
        return hp;
    }

    public void setHp(int hp) {
        if( hp<0){
            hp = 0;
        }else if(hp>maxHP){//=======这里使用变量
            hp = maxHP;//=======这里使用变量
        }
        this.hp = hp;
    }
}

原文出处:https://malaoshi.top/show_1IX3O1hBZRQ6.html