**开闭原则(Open Closed Principle)**是编程中最基础、最重要的设计原则
- 一个软件实体如类,模块和函数应该对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节。
- 当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
- 编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。
总结: 就是不要修改原来的代码, 如果要扩展新的功能,就只能去添加新的代码,不能去动以前的代码
我们现在要写一个游戏,怪物和人物的战斗系统,代码如下:
这里有3个类:怪物,角色,战斗系统,根据不同的怪物,角色会减少不同的血量。通过在fight系统里面判断不同的怪物类型,减少角色血量, 我们把怪物和角色委托给战斗系统,由战斗系统完成战斗功能。
public class SingleFantasy {
public static void main(String[] args) {
Fight fight = new Fight();
Monster monster1 = new Monster1();
Monster monster2 = new Monster2();
Hero hero = new Hero();
fight.fight(monster1, hero);
fight.fight(monster2, hero);
}
}
interface Monster{
}
class Monster1 implements Monster{
}
class Monster2 implements Monster{
}
class Fight{
public void fight(Monster monster, Hero hero){
String[] name = monster.getClass().getName().replace('.', '#').split("#");
String type = name[name.length - 1]; //获取怪物的类名
if(type.equals("Monster1") )
hero.reduceBlood(1, type);
else if(type.equals("Monster2"))
hero.reduceBlood(2, type);
}
}
class Hero{
private int blood = 1000;
public void reduceBlood(int s, String name){
this.blood -= s;
System.out.println("角色被" + name + "打了一下, 减少" + s + "滴血");
}
}
角色被Monster1打了一下, 减少1滴血
角色被Monster2打了一下, 减少2滴血
这里就有有一个问题
: 如果我们增加怪物, 那么我们就必须去战斗系统里面增加if语句
判断, 减少相应的血量。这就未被了原则, 现在我们根据原则重新设计这套系统
我们把英雄角色减血的操作委托给怪物来完成,这样,以后我们新增怪物的时候,就自己写好,完成相应的功能就行,不需要去改变以前的代码。
public class SingleFantasy {
public static void main(String[] args) {
Fight fight = new Fight();
Monster monster1 = new Monster1();
Monster monster2 = new Monster2();
Hero hero = new Hero();
fight.fight(monster1, hero);
fight.fight(monster2, hero);
}
}
interface Monster{
void fight(Hero hero);
}
class Monster1 implements Monster{
private int s = 10;
private String name = "小兵";
@Override
public void fight(Hero hero) {
hero.reduceBlood(s, name);
}
}
class Monster2 implements Monster{
private int s = 20;
private String name = "BOSS";
@Override
public void fight(Hero hero) {
hero.reduceBlood(s, name);
}
}
class Fight{
public void fight(Monster monster, Hero hero){
monster.fight(hero);
}
}
class Hero{
private int blood = 1000;
public void reduceBlood(int s, String name){
this.blood -= s;
System.out.println("角色被" + name + "打了一下, 减少" + s + "滴血");
}
}
角色被小兵打了一下, 减少10滴血
角色被BOSS打了一下, 减少20滴血