云南大学软件学院设计模式实验 策略模式
- 格式:doc
- 大小:104.00 KB
- 文档页数:6
云大软件工程实验三软件设计云大软件工程实验三软件设计1.引言1.1 目的1.2 背景1.3 定义、缩略词和首字母缩略词的解释2.需求分析2.1 功能需求2.1.1 功能12.1.2 功能22.1.32.2 非功能需求2.2.1 性能需求2.2.2 可靠性需求2.2.3 安全性需求2.2.43.概要设计3.1 架构设计3.1.1 客户端-服务器架构3.1.2 分层架构3.1.33.2 模块划分3.2.1 模块13.2.2 模块23.2.33.3 接口设计3.3.1 外部接口3.3.2 内部接口3.3.33.4 数据库设计3.4.1 数据库结构3.4.2 数据库表设计3.4.34.详细设计4.1 模块1设计4.1.1 子模块1.1设计 4.1.2 子模块1.2设计 4.1.34.2 模块2设计4.2.1 子模块2.1设计 4.2.2 子模块2.2设计4.2.35.测试计划5.1 功能测试5.1.1 功能1测试用例 5.1.2 功能2测试用例 5.1.35.2 性能测试5.2.1 性能指标5.2.2 性能测试用例5.2.35.3 安全性测试5.3.1 安全漏洞测试用例5.3.2 安全性能测试用例5.3.36.上线计划6.1 部署步骤6.1.1 部署环境准备6.1.2 代码6.1.36.2 回滚计划6.3 验收标准附件:附件一:需求说明书附件二:设计图纸附件三:测试用例法律名词及注释:1.版权:对作品(例如文学、音乐、软件等)所赋予的法律上的保护,使其著作权人能够授权他人使用或复制作品。
2.专利:对发明的新技术、产品或方法的法律保护,使其专利持有人拥有独占使用或制造的权利。
3.商标:能够识别品牌或企业的标志、名称、符号或设计的法律保护,使其商标持有人能够独占使用。
4.涉密信息:指涉及国家安全、经济安全、社会公共利益和个人隐私安全等方面的机密信息。
云南大学软件学院综合技能实践——《常用开发平台的安装和使用》实验指导书指导教师:梁宇蔡莉(注意:请先简要阅读实验指导书的要求再开始做实验)第一部分 JSP开发环境的搭建一、实验目的:1.掌握JSP开发环境搭建的具体步骤和操作方法。
2.掌握在JSP开发环境下创建一个简单JSP文件的方法。
3.掌握在JSP中创建虚拟目录的方法。
二、实验内容预习一、JSP概述JSP(Java Server Pages,Java服务器主页)技术为创建显示动态生成内容的Web页面提供了个简捷而快速的方法。
JSP技术的设计目的使得构造基于Web 的应用程序更加容易和快捷,这些应用程序能够与各种Web服务器、应用服务器、浏览器和开发工具共同工作。
JSP的明显优势如下:平台和服务器的独立性。
基于Java的JSP与平台无关,它可以使用任何web服务器(包括Apache、IIS和PWS)。
使用的脚本语言。
JSP使用Java作为它的脚本语言,其面向对象的编程思想较为优秀。
JSP跨平台的可重用性。
J3P组件(Enterprise JavaBeans,JavaBeans)都是跨平台可重用的。
EJB(Enterprise JavaBeans,企业级JavaBeans)组件可以访问传统的数据库,并能以分布式系统模式工作于UNIX 和Windows平台。
多样化和功能强大的开发工具支持。
JSP已经有了许多非常优秀的开发工具而是有许多可以免费获取,且其中行许多开发工具已经可以顺利地运行于多种平台之下。
二、建立JSP的运行环境由于JSP使用Java作为程序设计脚本语言,因此需要建立Java的运行环境。
编译和调试运行Java程序,需要安装JDK(Java Develop Kit,Java开发工具包)。
另外,JSP是基于Web的Java应用程序,因而它需要有特定的运行环境,即解释器。
由于Java语言是跨平台的,所以能解释Java语言的Web服务器与平台无关。
【精品实验报告】软件体系结构设计模式实验报告软件体系结构设计模式实验报告学生姓名: 所在学院: 学生学号: 学生班级: 指导老师: 完成日期:一、实验目的熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的设计模式,包括组合模式、外观模式、代理模式、观察者模式和策略模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式,并学会分析这些模式的使用效果。
二、实验内容使用PowerDesigner和任意一种面向对象编程语言实现组合模式、外观模式、代理模式、观察者模式和策略模式,包括根据实例绘制模式结构图、编写模式实例实现代码,运行并测试模式实例代码。
(1) 组合模式使用组合模式设计一个杀毒软件(AntiVirus)的框架,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒,文件种类包括文本文件TextFile、图片文件ImageFile、视频文件VideoFile。
绘制类图并编程模拟实现。
(2) 组合模式某教育机构组织结构如下图所示:北京总部教务办公室湖南分校行政办公室教务办公室长沙教学点湘潭教学点行政办公室教务办公室行政办公室教务办公室行政办公室在该教育机构的OA系统中可以给各级办公室下发公文,现采用组合模式设计该机构的组织结构,绘制相应的类图并编程模拟实现,在客户端代码中模拟下发公文。
(注:可以定义一个办公室类为抽象叶子构件类,再将教务办公室和行政办公室作为其子类;可以定义一个教学机构类为抽象容器构件类,将总部、分校和教学点作为其子类。
)(3) 外观模式某系统需要提供一个文件加密模块,加密流程包括三个操作,分别是读取源文件、加密、保存加密之后的文件。
读取文件和保存文件使用流来实现,这三个操作相对独立,其业务代码封装在三个不同的类中。
现在需要提供一个统一的加密外观类,用户可以直接使用该加密外观类完成文件的读取、加密和保存三个操作,而不需要与每一个类进行交互,使用外观模式设计该加密模块,要求编程模拟实现。
云大软件工程实验三软件设计在软件工程的学习中,实验是帮助我们深入理解理论知识、掌握实际操作技能的重要环节。
实验三的软件设计,更是让我们亲身体验了从需求分析到架构搭建的整个过程,这不仅考验了我们的专业知识,也锻炼了我们的逻辑思维和创新能力。
软件设计,简单来说,就是根据用户的需求,确定软件系统的整体结构、模块划分、数据结构、算法流程等。
它就像是为一座即将建造的大楼绘制蓝图,只有设计得合理、完善,后续的施工(编码)才能顺利进行,最终建成的大楼(软件系统)才能坚固、美观、实用。
在本次实验中,我们首先进行了需求分析。
需求分析是软件设计的基础,就如同盖房子前要明确房子的用途、居住人数、功能需求等。
我们通过与用户的沟通、对业务流程的了解,收集了大量的需求信息,并对其进行整理、分类和优先级排序。
这其中,要特别注意需求的明确性和完整性,避免模糊不清或者遗漏重要需求,否则后续的设计和开发工作将会陷入困境。
接下来是总体设计。
在这个阶段,我们要确定软件系统的整体架构,比如是采用 C/S 架构还是 B/S 架构,是分层架构还是微服务架构等。
同时,还要划分出各个模块,并明确它们之间的关系。
这就像是把大楼划分成不同的区域,如客厅、卧室、厨房等,并确定它们之间的通道和连接方式。
在进行总体设计时,要充分考虑系统的可扩展性、可维护性和性能等方面的要求。
然后是详细设计。
详细设计是对总体设计的进一步细化,包括每个模块的内部结构、算法流程、数据结构、接口定义等。
这就好比是为每个房间确定具体的布局、装修风格、家具摆放等。
详细设计的好坏直接影响到代码的编写质量和效率,因此需要我们非常仔细和认真地对待。
在软件设计过程中,有几个关键的原则需要遵循。
首先是高内聚低耦合原则。
高内聚意味着一个模块内部的各个元素之间联系紧密,共同完成一个明确的功能;低耦合则表示模块之间的依赖关系尽量少,这样当一个模块发生变化时,对其他模块的影响最小。
其次是开闭原则,即软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
计算机科学与技术学院实验报告课程名称:软件设计模式专业:计算机科学与技术班级:2011 级 1 班学号:201113137040 姓名:刘进平实验一单例模式的应用1 实验目的1) 掌握单例模式(Singleton)的特点2) 分析具体问题,使用单例模式进行设计。
2 实验内容和要求很多应用项目都有配置文件,这些配置文件里面定义一些应用需要的参数数据。
通常客户端使用这个类是通过new一个AppConfig的实例来得到一个操作配置文件内容的对象。
如果在系统运行中,有很多地方都需要使用配置文件的内容,系统中会同时存在多份配置文件的内容,这会严重浪费内存资源。
事实上,对于AppConfig类,在运行期间,只需要一个对象实例就够了。
那么应该怎么实现呢?用C#控制台应用程序实现该单例模式。
绘制该模式的UML图。
UML图:源代码:class Program{static void Main(string[] args){AppConfig appConfigOne = AppConfig.GetParameterA();AppConfig appConfigTwo = AppConfig.GetParameterA();if (appConfigOne.Equals(appConfigTwo)){Console.WriteLine("appConfigOne 和appConfigTwo 代表的是同一个实例!");}else{Console.WriteLine("appConfigOne 和appConfigTwo 代表的是不同的实例!");}Console.ReadKey();}}}运行结果:实验小结:通过这次实验,我了解了单例模式的具体概念和使用方法,并且感受到了他的优点带来的方便,但是同时也知道了该设计模式的缺点:由于单例模式中没有抽象层,因此单例类的扩展有很大困难。
云南大学软件学院实验报告序号:姓名:学号:专业:软件工程日期:2015.12.21 成绩:实验四命令模式的运用一、实验目的:命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象,命令模式也支持可撤销的操作。
在熟悉命令模式相关理论知识的基础上,使用命令模式实现图片处理程序。
二、实验要求:使用命令模式实现图片处理程序,要求如下:1.图片处理程序要有3张图片。
2.每张图片至少有3种操作。
3.实现类似遥控器的菜单,动态的选择对图片进行的处理。
4.要有“撤消操作”,撤消操作要可以撤销至最后一步。
1、设计并绘制该程序的类图;2、依照设计的类图使用Java语言编写代码,并实现该程序;3、除了核心的模式相关类实现外,提供测试环境,按照难度高低,分别是:a)控制台程序,Client硬编码初始化模式和测试环境,运行结果文本输出;b)控制台程序,Client初始化测试环境,并根据用户输入运算,运行结果文本输出;c)设计并实现用户UI,Client初始化测试环境,并根据用户在UI控件上的输入运算,运行结果文本输出;三、实验内容:实验类图:实验代码:1 DrawControl类public class DrawControl {ArrayList<DrawCommand> dcommand=new ArrayList<DrawCommand>();public void addCommand(DrawCommand dc){dcommand.add(dc);}public void removeCommand(DrawCommand dc){for(int i=0;i<dcommand.size();i++)if(dcommand.get(i).getClass().equals(getClass())){dcommand.remove(i);}}public void executeCommand(DrawCommand dc){for(int i=0;i<dcommand.size();i++)if(dcommand.get(i).getClass().equals(getClass())){dcommand.get(i).execute();}}public void undoCommand(DrawCommand dc){if (dcommand.size() > 1) {dcommand.get(dcommand.size() - 1).undo();dcommand.remove(dcommand.size() - 1);} elseSystem.out.println("Here is end, you can't undo");}}2 DrawCommand接口类package design4;interface DrawCommand {public void execute();public void undo();}3 Circular类public class Circular extends JPanel {Ellipse2D e =null;private int w,h;int f;public Circular(int w,int h){this.w=w;this.h=h;} //画圆型public void drawCircular(){e=new Ellipse2D.Double(w/2,h/4,50,50);f=1;repaint();} //画椭圆形public void drawEllipse(){e=new Ellipse2D.Double(w/2,h/4,20,70);f=1;repaint();} //画实心圆public void drawSolidRound(){f=2;e=new Ellipse2D.Double(w/2,h/4,50,50);repaint();}public void paintComponent(Graphics g){super.paintComponent(g);if(f==1){Graphics2D g2=(Graphics2D) g;g2.draw(e);}else{Graphics2D g2=(Graphics2D) g;//g2.draw(e);g2.setPaint(Color.RED);g2.fill(e);}}}4 Circular Command类package design4;public class CircularCommand implements DrawCommand{ Circular circular;public CircularCommand(Circular c){circular=c;}public void execute() {circular.drawCircular();}public void undo() {// TODO Auto-generated method stub}}5 DrawJFrampackage design4;import java.awt.Container;import java.awt.GridLayout;import java.awt.Panel;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;public class DrawJFram extends JFrame implements ActionListener{JComboBox comboBox,comboBox2,comboBox3;String[] str={"圆形","椭圆","实心圆"};String[] str2={"方形","正方形","长方形"};String[] str3={"三角形","等腰直角三角形","等边三角形"};public DrawJFram (){super(" ");this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setcomputerWindow();}private void setcomputerWindow() {// TODO Auto-generated method stub Container ct=this.getContentPane();Container ct=this.getContentPane();ct.setLayout(new GridLayout(6,1));Panel p1=new Panel();p1.add(new JLabel("圆形:"));comboBox=new JComboBox(str);p1.add(comboBox);p1.add(new JLabel("方形:"));comboBox2=new JComboBox(str2);p1.add(comboBox2);p1.add(new JLabel("三角形:"));comboBox3=new JComboBox(str3);p1.add(comboBox3);comboBox.addActionListener(this);comboBox2.addActionListener(this);comboBox3.addActionListener(this);ct.add(p1,"North");}public void actionPerformed(ActionEvent e) {if(e.getSource().equals(comboBox)){if(comboBox.getSelectedItem().equals("圆形")){Circular circular=new Circular(100, 100);this.add(circular,"South");circular.drawCircular();this.setVisible(true);}else if(comboBox.getSelectedItem().equals("椭圆")){Circular circular=new Circular(30, 70);this.add(circular,"South");circular.drawEllipse();this.setVisible(true);}else if(comboBox.getSelectedItem().equals("实心圆")){Circular circular=new Circular(50, 50);this.add(circular,"South");circular.drawSolidRound();this.setVisible(true);}}else if(e.getSource().equals(comboBox2)){if(comboBox2.getSelectedItem().equals("方形")){Rectangle rectangle=new Rectangle(100, 100);this.add(rectangle,"South");rectangle.drawhighRectangle();this.setVisible(true);}else if(comboBox2.getSelectedItem().equals("长方形")){ Rectangle rectangle=new Rectangle(100, 100);this.add(rectangle,"South");rectangle.drawlongRectangle();this.setVisible(true);}else if(comboBox2.getSelectedItem().equals("正方形")){ Rectangle rectangle=new Rectangle(100, 100);this.add(rectangle,"South");rectangle.drawsquare();this.setVisible(true);}}else if(e.getSource().equals(comboBox3)){if(comboBox3.getSelectedItem().equals("三角形")){Triangle triangle=new Triangle(500, 10);this.add(triangle,"South");triangle.drawTriangle();this.setVisible(true);}else if(comboBox3.getSelectedItem().equals("等腰直角三角形")){ Triangle triangle=new Triangle(500, 30);this.add(triangle,"South");triangle.drawIsoscelesTriangle();this.setVisible(true);}else if(comboBox3.getSelectedItem().equals("等边三角形")){ Triangle triangle=new Triangle(500, 50);this.add(triangle);triangle.draweQuilateralTriangle();this.setVisible(true);}}}}6 pictureMainpackage design4;import java.awt.Dimension;import java.awt.Toolkit;public class pictureMain {public static void main(String[] args) {// TODO Auto-generated method stubToolkit kit=Toolkit.getDefaultToolkit();Dimension screenSize=kit.getScreenSize();int screenHeihgt=screenSize.height;int screenWidth=screenSize.width;DrawJFram drawJFram=new DrawJFram();drawJFram.setSize(screenWidth,screenHeihgt);drawJFram.setVisible(true);}}实验结果四、实验总结:我经过本次命令模式的实验,通过自己动手编代码,是自己理解命令模式机制,并且知道命令模式有以下的优点:适用性:想要实现回调函数功能,想要在不同的时刻指定、排列和执行请求,需要支持取消和改变日志操作;效果:命令模式将调用操作的对象与知道如何实现该操作的对象解耦,Command是头等的对象。
软件设计中的策略模式与状态模式在软件设计中,一个重要的问题是如何面对不断变化的需求和特定的场景。
为了解决这一问题,软件开发人员通常采用一些设计模式来提高系统的可扩展性、可维护性和可重用性。
策略模式和状态模式都是比较常用的设计模式。
它们都可以用来处理不同场景下的变化,但它们却有不同的目标和应用场景。
策略模式的目的是允许一个对象在运行时选择算法的行为。
换句话说,这个模式允许你根据需要在程序执行的时候动态地改变一个对象的行为。
策略模式将复杂的算法分离成一个个单独的算法类,使得这些算法可以独立地进行修改和测试。
如果你要在程序中使用这种模式,你需要有一个上下文对象,负责选择合适的算法来完成某个特定的任务。
举个例子,假设你要开发一个计算器程序,其中有加、减、乘、除四种运算。
那么策略模式可以很好地解决这个问题。
你可以定义一个策略接口,在这个接口里定义所有的计算方法。
随后,你可以将加法算法、减法算法、乘法算法、除法算法分别实现这个接口,并将其封装起来。
最后,你可以在运行时动态地选择一个算法来完成计算任务。
状态模式的目的是让一个对象在运行时改变其行为。
状态模式允许你在运行时动态地切换一个对象的状态,并让这个对象根据不同的状态做出不同的反应。
这个模式是为了解决一个对象的状态转换对应的每个行为都需要写一遍的问题。
通过状态模式,你可以将每个状态转换的行为封装到一个状态类中,从而减少了代码的重复性,同时提高了系统的可扩展性和可维护性。
举个例子,假设你要开发一个电梯系统,其中包含多个状态:开门、关门、上升、下降。
那么状态模式可以很好地解决这个问题。
你可以定义一个状态接口,在这个接口里定义所有状态下的行为。
随后,你可以将每个状态封装到一个状态实现类中,并在其中实现状态下的所有行为。
最后,在上下文对象中维护一个状态变量,并在不同的状态下调用不同的行为。
总的来说,策略模式和状态模式都是非常有用的设计模式,可以提高系统的可扩展性、可维护性和可重用性。
实验报告1-策略模式云南大学软件学院实验报告序号:姓名:杨林燕学号:20111120106 专业:软件工程日期:成绩:实验一策略模式的运用一、实验目的:策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
在熟悉策略模式相关理论知识的基础上,使用策略模式实现一个小游戏。
二、实验要求:使用策略模式实现一个小游戏,要求如下:1.游戏中有三个角色:和尚,侠女,忍者;2.每个角色都有生命值和魔法值,但各角色不同。
3.各角色外观不同。
4.每个角色具有魔法攻击和物理攻击;5.物理攻击有三种:用刀、用剑、用手;6.魔法攻击也有三种:火系魔法、金系魔法、水系魔法;7.各角色可以动态更换物理、魔法攻击方式,也可以动态选择攻击方法。
1、设计并绘制该程序的类图;2、依照设计的类图使用Java语言编写代码,并实现该程序;3、除了核心的模式相关类实现外,提供测试环境,按照难度高低,分别是:a)控制台程序,Client硬编码初始化模式和测试环境,运行结果文本输出;b)控制台程序,Client初始化测试环境,并根据用户输入运算,运行结果文本输出;c)设计并实现用户UI,Client初始化测试环境,并根据用户在UI控件上的输入运算,运行结果文本输出;三、实验内容:1.类图:2.代码:Role类:public abstract class Role {WuliGong wuliGong;MofaGong mofaGong;public Role(){ }public abstract void display();public void performWuli() {wuliGong.wuli(); MofaShuimofa(){}MofaJinmofa(){}MofaHuomofa(){}WuliDao wuli(){} WuliJianwuli(){}WuliShouwuli(){}《interface》WuliGong wuli()《interface》MofaGongmofa()RoleWuliGong wuliGongMofaGong mofaGongdisplay();performWuli()performMofa()waiguan()setWuliGong()setMofaGong()RoleModisplay(){}RoleHe display(){ } RoleRen display(){ }}public void performMofa(){mofaGong.mofa();}public void waiguan() {System.out.println("每个角色外观不同!");}public void setWuliGong(WuliGong wg){ wuliGong = wg;}public void setMofaGong(MofaGong mg){ mofaGong = mg;}}Role继承类:public class RoleHe extends Role{public RoleHe(){wuliGong = new WuliDao();mofaGong = new MofaJin();}public void display(){System.out.println("我是和尚");}}public class RoleMo extends Role{public RoleMo(){mofaGong = new MofaHuo();wuliGong = new WuliShou();}public void display(){System.out.println("我是魔女");}}public class RoleRen extends Role{public RoleRen(){wuliGong = new WuliJian();mofaGong = new MofaShui();}public void display(){System.out.println("我是忍者");}}MofaGong接口:public interface MofaGong {public void mofa();}public class MofaHuo implements MofaGong { public void mofa() {System.out.println("正在使用火系魔法攻击对方");}}public class MofaJin implements MofaGong { public void mofa() {System.out.println("正在使用金系魔法攻击对方");}}public class MofaShui implements MofaGong { public void mofa() {System.out.println("正在使用水系魔法攻击对方");}}WuliGong接口:public interface WuliGong {public void wuli();}public class WuliDao implements WuliGong { public void wuli() {System.out.println("正在使用刀攻击对方");}}public class WuliJian implements WuliGong { public void wuli() {System.out.println("正在使用剑攻击对方");}}public class WuliShou implements WuliGong { public void wuli() {System.out.println("正在使用手攻击对方");}}YanShi类:public class YanShi {public static void main(String[] args) {Role he=new RoleHe();he.display();he.performWuli();he.performMofa();Role mo=new RoleMo();mo.display();mo.performMofa();mo.performWuli();Role ren=new RoleRen();ren.display();ren.performWuli();ren.performMofa();}}3.测试结果:四、实验总结:通过本次实验,深化了解了策略模式的结构,意图以及使用效果。
云南大学软件学院实验报告序号:姓名:徐鑫桥学号: 20121120034 专业:数字媒体技术日期:成绩:实验一策略模式的运用一、实验目的:策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
在熟悉策略模式相关理论知识的基础上,使用策略模式实现一个小游戏。
二、实验要求:使用策略模式实现一个小游戏,要求如下:1.游戏中有三个角色:和尚,侠女,忍者;2.每个角色都有生命值和魔法值,但各角色不同。
3.各角色外观不同。
4.每个角色具有魔法攻击和物理攻击;5.物理攻击有三种:用刀、用剑、用手;6.魔法攻击也有三种:火系魔法、金系魔法、水系魔法;7.各角色可以动态更换物理、魔法攻击方式,也可以动态选择攻击方法。
1、设计并绘制该程序的类图;2、依照设计的类图使用Java语言编写代码,并实现该程序;3、除了核心的模式相关类实现外,提供测试环境,按照难度高低,分别是:a)控制台程序,Client硬编码初始化模式和测试环境,运行结果文本输出;b)控制台程序,Client初始化测试环境,并根据用户输入运算,运行结果文本输出;c)设计并实现用户UI,Client初始化测试环境,并根据用户在UI控件上的输入运算,运行结果文本输出;三、实验内容:类图:相关代码: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.测试结果:四、实验总结:通过本次实验,了解了基本策略模式的结构,意图以及使用效果。
云南大学软件学院
实验报告
序号:姓名:徐鑫桥学号: 20121120034 专业:数字媒体技术日期:成绩:
实验一策略模式的运用
一、实验目的:
策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
在熟悉策略模式相关理论知识的基础上,使用策略模式实现一个小游戏。
二、实验要求:
使用策略模式实现一个小游戏,要求如下:
1.游戏中有三个角色:和尚,侠女,忍者;
2.每个角色都有生命值和魔法值,但各角色不同。
3.各角色外观不同。
4.每个角色具有魔法攻击和物理攻击;
5.物理攻击有三种:用刀、用剑、用手;
6.魔法攻击也有三种:火系魔法、金系魔法、水系魔法;
7.各角色可以动态更换物理、魔法攻击方式,也可以动态选择攻击方法。
1、设计并绘制该程序的类图;
2、依照设计的类图使用Java语言编写代码,并实现该程序;
3、除了核心的模式相关类实现外,提供测试环境,按照难度高低,分别是:
a)控制台程序,Client硬编码初始化模式和测试环境,运行结果文本输出;
b)控制台程序,Client初始化测试环境,并根据用户输入运算,运行结果文本输出;
c)设计并实现用户UI,Client初始化测试环境,并根据用户在UI控件上的输入运算,
运行结果文本输出;
三、实验内容:
类图:
相关代码:
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.测试结果:
四、实验总结:
通过本次实验,了解了基本策略模式的结构,意图以及使用效果。
策略模式是一种定义一系列算法的方法,所有算法完成相同工作,但是实现不同。
每个算法都有自己的类,可以通过自己的借口单独测试,简化了单元测试。
算法和使用算法的对象相互分离,针对接口编程而非针对实现编程,把可能需要变化的代
码独立出来,组合优于继承。
客户程序可以在运行时动态选择算法,代码复用性好,便于修改和维护;用组合替代继承,效果更好。
消除了冗长的条件语句序列,将不同的算法硬编码进一个类中。
指导教师签名:。