策略模式的运用.docx
《策略模式的运用.docx》由会员分享,可在线阅读,更多相关《策略模式的运用.docx(10页珍藏版)》请在冰豆网上搜索。
策略模式的运用
实验报告
序号:
姓名:
学号:
专业:
日期:
成绩:
实验一策略模式的运用
一、实验目的:
策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
在熟悉策略模式相关理论知识的基础上,使用策略模式实现一个小游戏。
二、实验要求:
使用策略模式实现一个小游戏,要求如下:
1.游戏中有三个角色:
和尚,侠女,忍者;
2.每个角色都有生命值和魔法值,但各角色不同。
3.各角色外观不同。
4.每个角色具有魔法攻击和物理攻击;
5.物理攻击有三种:
用刀、用剑、用手;
6.魔法攻击也有三种:
火系魔法、金系魔法、水系魔法;
7.各角色可以动态更换物理、魔法攻击方式,也可以动态选择攻击方法。
1、设计并绘制该程序的类图;
2、依照设计的类图使用Java语言编写代码,并实现该程序;
3、除了核心的模式相关类实现外,提供测试环境,按照难度高低,分别是:
a)控制台程序,Client硬编码初始化模式和测试环境,运行结果文本输出;
b)控制台程序,Client初始化测试环境,并根据用户输入运算,运行结果文本输出;
c)设计并实现用户UI,Client初始化测试环境,并根据用户在UI控件上的输入运算,运行结果文本输出;
三、实验内容:
类图
代码
Character.Java
importjava.util.Scanner;
publicabstractclassCharacter{
publicStringlook;
Magic_attackma;
Physical_attackpa;
publicvoidmagic_attack_way(){
ma.magic();
}
publicvoidphysical_attack_way(){
pa.physical();
}
publicvoidsetMa(Magic_attackm){
this.ma=m;
}
publicMagic_attackgetMa(){
returnma;
}
publicStringgetLook(){
returnlook;
}
publicvoidsetLook(Stringlook){
this.look=look;
}
publicPhysical_attackgetPa(){
returnpa;
}
publicvoidsetPa(Physical_attackpa){
this.pa=pa;
}
publicabstractvoiddisplay();
Scannersc=newScanner(System.in);
publicvoidchange(Characterx){
System.out.println("想更换物理、魔法攻击方式,和技能吗?
1yes2no");
for(intp=0;p<1;){
Stringk=sc.nextLine();
switch(k){
case"1":
System.out.println("输入你想要改变的攻击方法,1物攻,2法功");
Stringt=sc.nextLine();
switch(t){
case"1":
System.out.println("输入你想要改变的攻击方式,1手,2刀,3剑,4,不更改");
Stringpw=sc.nextLine();
switch(pw){
case"1":
x.setPa(newPhysical_hand());
System.out.println("更改后的效果");
x.physical_attack_way();
break;
case"2":
x.setPa(newPhysical_knife());
System.out.println("更改后的效果");
x.physical_attack_way();
break;
case"3":
x.setPa(newPhysical_sword());
System.out.println("更改后的效果");
x.physical_attack_way();
break;
default:
break;
}
break;
case"2":
System.out.println("输入你想要改变的攻击方式,1水,2火,3金,4,不更改");
Stringmw=sc.nextLine();
switch(mw){
case"1":
x.setMa(newMagic_gold());
System.out.println("更改后的效果");
x.magic_attack_way();
break;
case"2":
x.setMa(newMagic_fire());
System.out.println("更改后的效果");
x.magic_attack_way();
break;
case"3":
x.setMa(newMagic_gold());
System.out.println("更改后的效果");
x.magic_attack_way();
break;
default:
break;
}
break;
}
default:
p=1;
break;
}
}
}
}
Magic_attack.java
publicinterfaceMagic_attack{
publicvoidmagic();
}
Physical_attack.java
publicinterfacePhysical_attack{
publicvoidphysical();
}
Magic_fire.java
publicclassMagic_fireimplementsMagic_attack{
publicvoidmagic(){
//TODO自动生成的方法存根
System.out.println("正在用火魔法攻击");
}
}
Magic_gold.java
publicclassMagic_goldimplementsMagic_attack{
publicvoidmagic(){
System.out.println("正在用金魔法攻击");
}
}
Magic_water.java
publicclassMagic_waterimplementsMagic_attack{
publicvoidmagic(){
System.out.println("正在用水魔法攻击");
}
}
Physical_hand.java
publicclassPhysical_handimplementsPhysical_attack{
publicvoidphysical(){
System.out.println("用双手才是最强的表现");
}
}
Physical_knife.java
publicclassPhysical_knifeimplementsPhysical_attack{
publicvoidphysical(){
System.out.println("我是用刀的,屠龙在手,天下我有");
}
}
Physical_sword.java
publicclassPhysical_swordimplementsPhysical_attack{
publicvoidphysical(){
System.out.println("我是用剑的,倚天一出,谁与争锋");
}
}
Monk.java
publicclassMonkextendsCharacter{
publicMonk(){
ma=newMagic_fire();
pa=newPhysical_hand();
look="光头";
}
publicvoiddisplay(){
//TODO自动生成的方法存根
System.out.println("我是和尚,外观:
"+look);
}
}
Kungfuwoman.java
publicclassKungfuwomanextendsCharacter{
publicKungfuwoman(){
ma=newMagic_water();
pa=newPhysical_sword();
look="长剑配青衫";
}
publicvoiddisplay(){
//TODO自动生成的方法存根
System.out.println("我是侠女,外观:
"+look);
}
}
测试类
Test.Java
importjava.util.Scanner;
publicclasstest{
publicstaticvoidmain(String[]args){
//TODO自动生成的方法存根
Scannersc=newScanner(System.in);
for(inti=1;i<=2;)
{
System.out.println("请输入角色类型查看技能及属性1:
Monk2:
Kungfuwoman3:
Ninja任意键终止程序");
Stringflag=sc.nextLine();
switch(flag)
{
case"1":
Characterc=newMonk();
System.out.println("拥有技能展示");
c.magic_attack_way();
c.physical_attack_way();
c.display();
c.change(c);
break;
case"2":
Characterd=newKungfuwoman();
System.out.println("拥有技能展示");
d.magic_attack_way();
d.physical_attack_way();
d.display();
d.change(d);
break;
case"3":
Charactere=newNinja();
System.out.println("拥有技能展示");
e.magic_attack_way();
e.physical_attack_way();
e.display();
e.change(e);
break;
default:
i=4;
sc.close();
break;
}
}
}
}
运行显示
1.更换技能
2.角色信息展示
四、实验总结:
此次试验让我学到了策略模式的简单应用,把经常变化的东西分离开来,不变的放一块,总接口实现变化的部分,代码复用性号,便于修改和维护。
指导教师签名: