资源描述
云南大学软件学院
实 验 报 告
序号: 姓名: 徐鑫桥 学号: 20121120034 专业: 数字媒体技术 日期: 成绩:
实验一 策略模式的运用
一、实验目的:
策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。在熟悉策略模式相关理论知识的基础上,使用策略模式实现一个小游戏。
二、实验要求:
使用策略模式实现一个小游戏,要求如下:
1. 游戏中有三个角色:和尚,侠女,忍者;
2. 每个角色都有生命值和魔法值,但各角色不同。
3. 各角色外观不同。
4. 每个角色具有魔法攻击和物理攻击;
5. 物理攻击有三种:用刀、用剑、用手;
6. 魔法攻击也有三种:火系魔法、金系魔法、水系魔法;
7. 各角色可以动态更换物理、魔法攻击方式,也可以动态选择攻击方法。
1、 设计并绘制该程序的类图;
2、 依照设计的类图使用Java语言编写代码,并实现该程序;
3、 除了核心的模式相关类实现外,提供测试环境,按照难度高低,分别是:
a) 控制台程序,Client硬编码初始化模式和测试环境,运行结果文本输出;
b) 控制台程序,Client初始化测试环境,并根据用户输入运算,运行结果文本输出;
c) 设计并实现用户UI,Client初始化测试环境,并根据用户在UI控件上的输入运算,运行结果文本输出;
三、实验内容:
类图:
MagWater
Mag(){}
MagGold
Mag(){}
MagFire
Mag(){}
PhyKnife
Phy(){}
PhySword
Phy(){}
PhyHand
Phy(){}
interface
PhyAttack
Phy()
interface
MagAttack
Mag()
Role
PhyAttack phyA
MagAttack magA
display();
perforPhy()
performMag()
Appearance()
setPhyAttack()
setMagAttack()
Magicer
display(){
}
Buddhist
display(){
}
Ninjia
display(){
}
相关代码:
Role类及其继承类:
Role类:
public abstract class Role {
PhyAttack phyA;
MagAttack magA;
public Role(){ }
public abstract void display();
public void performPhy() {
phyA.Phy();
}
public void performMag(){
magA.Mag();
}
public void Appearance() {
System.out.println("每个角色外观不同!");
}
public void LifeMagic(){
System.out.println("每个角色生命值和魔法值不同");
}
public void setPhyAttack(PhyAttack pa){
phyA = pa;
}
public void setMagAttack(MagAttack ma){
magA = ma;
}
}
Role继承类:
Buddhist类:
public class Buddhist extends Role{
public Buddhist(){
}
public void display(){
System.out.println("这个角色是和尚");
System.out.println("外观:;生命值:100 ;魔法值100");
}
}
Ninjia类:
public class Ninjia extends Role{
public Ninjia(){
}
public void display(){
System.out.println("这个角色是忍者");
System.out.println("外观:;生命值:200;魔法值:35");
}
}
Magicer类:
public class Magicer extends Role{
public Magicer(){
}
public void display(){
System.out.println("这个角色是侠女");
System.out.println("外观:;生命值:75;魔法值:225");
}
}
}
MagAttack接口及其相关实现类:
接口:
public interface MagAttack {
public void Mag();
}
MagFire类:
public class MagFire implements MagAttack {
public void Mag() {
System.out.println("用火系魔法攻击对方");
}
}
MagGold类:
public class MagGold implements MagAttack {
public void Mag() {
System.out.println("用金系魔法攻击对方");
}
}
MagWater类:
public class MagGold implements MagAttack {
public void Mag() {
System.out.println("用金系魔法攻击对方");
}
}
PhyAttack接口及其相关实现类:
Phyattack接口:
public interface PhyAttack {
public void Phy();
}
PhyKnife类:
public class PhyKnife implements PhyAttack {
public void Phy() {
System.out.println("用刀攻击对方");
}
}
PhySword类:
public class PhySword implements PhyAttack {
public void Phy() {
System.out.println("用剑攻击对方");
}
}
PhyHand类:
public class PhyHand implements PhyAttack {
public void Phy() {
System.out.println("用手攻击对方");
}
}
Show类:
public class Show {
public static void main(String[] args) {
Role Budd=new Buddhist();
Budd.display();
Budd.setPhyAttack(new PhyHand());
Budd.performPhy();
Budd.setPhyAttack(new PhyKnife());
Budd.performPhy();
Budd.setMagAttack(new MagGold());
Budd.performMag();
Role Magic=new Magicer();
Magic.display();
Magic.setMagAttack(new MagFire());
Magic.performMag();
Magic.setMagAttack(new MagWater());
Magic.performMag();
Magic.setMagAttack(new MagGold());
Magic.performMag();
Magic.setPhyAttack(new PhyHand());
Magic.performPhy();
Role Nin=new Ninjia();
Nin.display();
Nin.setPhyAttack(new PhyKnife());
Nin.performPhy();
Nin.setPhyAttack(new PhySword());
Nin.performPhy();
Nin.setPhyAttack(new PhyHand());
Nin.performPhy();
Nin.setMagAttack(new MagFire());
Nin.performMag();
System.out.println("20121120034 数字媒体技术 徐鑫桥");
}
}
3.测试结果:
四、实验总结:
通过本次实验,了解了基本策略模式的结构,意图以及使用效果。策略模式是一种定义一系列算法的方法,所有算法完成相同工作,但是实现不同。 每个算法都有自己的类,可以通过自己的借口单独测试,简化了单元测试。
算法和使用算法的对象相互分离,针对接口编程而非针对实现编程,把可能需要变化的代码独立出来,组合优于继承。客户程序可以在运行时动态选择算法,代码复用性好,便于修改和维护;用组合替代继承,效果更好。消除了冗长的条件语句序列,将不同的算法硬编码进一个类中。
指导教师签名:
展开阅读全文