常用设计模式——策略模式

本文通过一个植物大战僵尸的游戏场景,介绍了如何运用策略设计模式来灵活地为僵尸添加不同的行为技能,如显示、移动和攻击。通过定义抽象僵尸类和各种具体技能接口,创建了不同类型的僵尸,如普通僵尸和举旗僵尸,并在运行时动态改变其行为,展示了策略模式在行为型设计模式中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计模式系列

1、组合模式
2、策略模式
3、单例模式
4、原型模式
5、模板模式
6、观察者模式
7、享元模式
8、装饰着模式
9、门面模式
10、责任链模式
11、建造者模式
12、适配器模式

什么是策略设计模式

植物大战僵尸这个游戏我之前老玩,尤其是上机课的时候偷偷玩,不等老师来啊,我的植物已经强大到任何僵尸不得靠近半步就一命呜呼了,这个僵尸是不是有点太弱了啊!
所以我想让植物大战僵尸里面的僵尸变得厉害点,那就要给僵尸加点技能,不至于轻易就被我打败了。那么要给创造出更加厉害的僵尸出来并且之前僵尸的基本技能还要保留,难道要重新定义一下僵尸,后面要想再加点更加厉害的僵尸难道还要再重新定义一个僵尸类吗,显然太麻烦了,那么策略设计模式就能很好的,灵活的来创建更加厉害的僵尸了。
一个僵尸类的算法可以在运行时更改,这种类型的设计模式属于行为型模式。
定义了算法族,让它们之间互相替换,此模式的变化独立于算法的使用者。

码云地址:去看源码

示例

1、定义一个僵尸

首先定义一个僵尸类,但是僵尸该有哪些攻击技能呢?

public abstract class Zombie {
}

2、定义僵尸基本技能

  1. 僵尸显示技能

僵尸是一开始就现身还是先隐藏一会儿呢?

public interface Displayable {
    void display();
}
  1. 僵尸移动技能

僵尸怎么移动呢,是走着前进还是跑着呢还是冲刺?

public interface Moveable {
    void move();
}
  1. 僵尸攻击技能

僵尸怎么攻击呢,是咬还是抓还是用手枪变成狂怒僵尸?

public interface Attackable {
    void attack();
}

3、定义真实的僵尸

刚才定义了一个僵尸的顶级类,但是是虚的,不知道是一个什么样的僵尸,现在要定义一些实际的僵尸出来。

1. 普通僵尸

要想成为一个僵尸,就要继承僵尸才是一个僵尸,普通僵尸只能有最基本的行为,就是 显示出来,并且可以向前移动,并且可以攻击。
下面就定义出来普通僵尸的 显示、移动和攻击的方式。

普通僵尸的显示方式就是一个骷髅头。

public class NormalZombieDisplay implements Displayable {
    @Override
    public void display() {
        System.out.println("普通窟窿头");
    }
}

普通僵尸就只能一步步完全缓慢移动。

public class NormalZombieMove implements Moveable {
    @Override
    public void move() {
        System.out.println("一步一步缓慢前行");
    }
}

普通僵尸就只能一口一口咬。

public class NormalZombieAttack implements Attackable {
    @Override
    public void attack() {
        System.out.println("大口大口咬.");
    }
}

普通僵尸的 显示、移动、攻击都定义好了,那就定义一个普通僵尸出来,并且拥有 显示、移动、攻击的特性。

public class NormalZombie extends Zombie {

    public NormalZombie(){
        super(new NormalZombieDisplay(), new NormalZombieMove(), new NormalZombieAttack());
    }

    public NormalZombie(Displayable displayable, Moveable moveable, Attackable attackable) {
        super(displayable, moveable, attackable);
    }
}

2. 举旗子僵尸

举旗子僵尸的 显示 方式和 普通僵尸 不一样,就是一个僵尸举着旗子。

public class FlagZombieDisplay implements Displayable {
    @Override
    public void display() {
        System.out.println("手持旗子");
    }
}

这个僵尸 显示方式是 不一样,移动 和 攻击 方式和普通僵尸一样。

public class FlagZombie extends Zombie {

    public FlagZombie() {
        super(new FlagZombieDisplay(), new NormalZombieMove(), new NormalZombieAttack());
    }

    public FlagZombie(Displayable displayable, Moveable moveable, Attackable attackable) {
        super(new FlagZombieDisplay(), moveable, attackable);
    }
}

4、测试

public class StrategyTest {
    public static void main(String[] args) {
        Zombie zombie = new NormalZombie();
        zombie.display();
        zombie.move();
        zombie.attack();
        zombie = new FlagZombie();
        zombie.display();
        zombie.move();
    }
}

执行结果:
普通窟窿头
一步一步缓慢前行
大口大口咬.
手持旗子
一步一步缓慢前行
大口大口咬.
从执行结果看出,目前有两种僵尸,普通僵尸和 举旗僵尸。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值