设计模式七大原则-开闭原则

**开闭原则(Open Closed Principle)**是编程中最基础、最重要的设计原则

  1. 一个软件实体如类,模块和函数应该对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节。
  2. 当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
  3. 编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。

总结: 就是不要修改原来的代码, 如果要扩展新的功能,就只能去添加新的代码,不能去动以前的代码

我们现在要写一个游戏,怪物和人物的战斗系统,代码如下:

这里有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滴血
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值