四个实验(两学时):策略模式、装饰者模式、抽象工厂模式、命令模式【没做GUI界面,只满足最简要求】
本文对你有用的话,记得点赞哦!以下是教科书&参考书
B站同名up猪,欢迎关注我的账号鸽子不二的个人空间-鸽子不二个人主页-哔哩哔哩视频
策略模式 Strategy Pattern
策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。在熟悉策略模式相关理论知识的基础上,使用策略模式实现一个小游戏。
一、基本要求
使用策略模式实现一个小游戏,要求如下:
- 游戏中有三个角色:和尚,侠女,忍者;
- 每个角色都有生命值和魔法值,但各角色不同。
- 各角色外观不同。
- 每个角色具有魔法攻击和物理攻击;
- 物理攻击有三种:用刀、用剑、用手;
- 魔法攻击也有三种:火系魔法、金系魔法、水系魔法;
各角色可以动态更换物理、魔法攻击方式,也可以动态选择攻击方法。
笔者推荐参考策略模式——在游戏设计中的思路-优快云博客
二、实验内容
1. 设计并绘制该程序的类图;
2. 依照设计的类图使用Java语言编写代码,并实现该程序;
3. 除了核心的模式相关类实现外,提供测试环境,按照难度高低,分别是:
a)控制台程序,Client硬编码初始化模式和测试环境,运行结果文本输出;
b)控制台程序,Client初始化测试环境,并根据用户输入运算,运行结果文本输出;
c)设计并实现用户UI,Client初始化测试环境,并根据用户在UI控件上的输入运算,运行结果文本输出;
三、实验提示
1. 策略模式的结构和组件
- Strategy:定义所有支持算法的公共接口,Context使用该接口调用某ConcreteStrategy定义的算法;
- ConcreteStrategy:以Strategy接口实现某具体算法;
- Context:用一个ConcreteStrategy对象来配置,维护一个对Strategy对象的引用,可定义一个接口来让Strategy访问它的数据;
2. 策略模式代码提示 【出自《Head First设计模式》一书】
SimUDuck范例:将duck的行为理解为 “一组行为”,并使用策略模式的“一族算法”来进行实现。
Duck基类
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {
}
public void setFlyBehavior (FlyBehavior fb) {
flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb) {
quackBehavior = qb;
}
abstract void display();
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
public void swim() {
System.out.println("All ducks float, even decoys!");
}
}
FlyBehavior和QuackBehavior接口
public interface QuackBehavior {
public void quack();
}
public interface FlyBehavior {
public void fly();
}
FlyWithWings具体行为
public class FlyWithWings implements FlyBehavior {
public void fly() {
System.out.println("I'm flying!!");
}
}
MiniDuckSimulator测试环境
public class MiniDuckSimulator {
public static void main(String[] args) {
MallardDuck mallard = new MallardDuck();
RubberDuck rubberDuckie = new RubberDuck();
DecoyDuck decoy = new DecoyDuck();
ModelDuck model = new ModelDuck();
mallard.performQuack();
rubberDuckie.performQuack();
decoy.performQuack();
model.performFly();
model.setFlyBehavior(new FlyRocketPowered());
model.performFly();
}
}
四、实验原理(算法或图)
图1 策略模式类图
五、源代码
Role(基类)
public abstract class Role {
Magic magic;
Physics physics;
public Role(Magic magic, Physics physics) {
setMagic(magic);
setPhysics(physics);
};
public abstract void display();
public void performMagic() {
magic.magicAttack();
}
public void performPhysics() {
physics.physicsAttack();
}
public void setMagic(Magic magic) {
this.magic = magic;
}
public void setPhysics(Physics physics) {
this.physics = physics;
}
}
Monk和尚、Heroine侠女、Ninja忍者(子类)
public class Monk extends Role {
public Monk(Magic magic, Physics physics) {
super(magic, physics);
}
@Override
public void display() {
System.out.println("我外貌像个和尚");
}
}
public class Heroine extends Role {
public Heroine(Magic magic, Physics physics) {
super(magic, physics);
}
@Override
public void display() {
System.out.println("我外貌像个侠女");
}
}
public class Ninja extends Role {
public Ninja(Magic magic, Physics physics) {
super(magic, physics);
}
@Override
public void display() {
System.out.println("我外貌像个忍者");
}
}
Magic接口
public interface Magic {
public void magicAttack() ;
}
实现Magic的类
public class MagicFire implements Magic {
@Override
public void magicAttack() {
System.out.println("正在使用火系魔法攻击");
}
}
public class MagicGold implements Magic {
@Override
public void magicAttack() {
System.out.println("正在使用金系魔法攻击");
}
}
public class MagicWater implements Magic {
@Override
public void magicAttack() {
System.out.println("正在使用水系魔法攻击");
}
}
Physics接口
public interface Physics {
public void physicsAttack() ;
}
实现Physics的类
public class PhysicsHand implements Physics {
@Override
public void physicsAttack() {
System.out.println("正在使用手进行物理攻击");
}
}
public class PhysicsKnife implements Physics {
@Override
public void physicsAttack() {
System.out.println("正在使用刀进行物理攻击");
}
}
public class PhysicsSword implements Physics {
@Override
public void physicsAttack() {
System.out.println("正在使用剑进行物理攻击");
}
}