说明
通过 王者荣耀 游戏,说明封装的重要性
有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());
}
}
亚瑟类的问题
产品经理为了游戏的平衡性,会频繁要求修改 亚瑟 的最大血量,如:修改为 1100、1200、1250时,我们每次都要修改 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;
}
}