设计模式实验报告
- 格式:doc
- 大小:2.17 MB
- 文档页数:116
第1篇一、实验背景随着软件工程的不断发展,设计模式作为一种解决软件开发中常见问题的有效方法,越来越受到广泛关注。
本次实验旨在通过学习设计模式,提高编程能力,掌握解决实际问题的方法,并加深对设计模式的理解。
二、实验目的1. 理解设计模式的基本概念和分类;2. 掌握常见设计模式的原理和应用;3. 提高编程能力,学会运用设计模式解决实际问题;4. 培养团队协作精神,提高项目开发效率。
三、实验内容本次实验主要涉及以下设计模式:1. 创建型模式:单例模式、工厂模式、抽象工厂模式、建造者模式;2. 结构型模式:适配器模式、装饰者模式、桥接模式、组合模式、外观模式;3. 行为型模式:策略模式、模板方法模式、观察者模式、责任链模式、命令模式。
四、实验过程1. 阅读相关资料,了解设计模式的基本概念和分类;2. 分析每种设计模式的原理和应用场景;3. 编写代码实现常见设计模式,并进行分析比较;4. 将设计模式应用于实际项目中,解决实际问题;5. 总结实验经验,撰写实验报告。
五、实验结果与分析1. 创建型模式(1)单例模式:通过控制对象的实例化,确保一个类只有一个实例,并提供一个访问它的全局访问点。
实验中,我们实现了单例模式,成功避免了资源浪费和同步问题。
(2)工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
实验中,我们使用工厂模式创建不同类型的交通工具,提高了代码的可扩展性和可维护性。
(3)抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。
实验中,我们使用抽象工厂模式创建不同类型的计算机,实现了代码的复用和扩展。
(4)建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
实验中,我们使用建造者模式构建不同配置的房屋,提高了代码的可读性和可维护性。
2. 结构型模式(1)适配器模式:将一个类的接口转换成客户期望的另一个接口,使原本接口不兼容的类可以一起工作。
【精品实验报告】软件体系结构设计模式实验报告软件体系结构设计模式实验报告学生姓名: 所在学院: 学生学号: 学生班级: 指导老师: 完成日期:一、实验目的熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的设计模式,包括组合模式、外观模式、代理模式、观察者模式和策略模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式,并学会分析这些模式的使用效果。
二、实验内容使用PowerDesigner和任意一种面向对象编程语言实现组合模式、外观模式、代理模式、观察者模式和策略模式,包括根据实例绘制模式结构图、编写模式实例实现代码,运行并测试模式实例代码。
(1) 组合模式使用组合模式设计一个杀毒软件(AntiVirus)的框架,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒,文件种类包括文本文件TextFile、图片文件ImageFile、视频文件VideoFile。
绘制类图并编程模拟实现。
(2) 组合模式某教育机构组织结构如下图所示:北京总部教务办公室湖南分校行政办公室教务办公室长沙教学点湘潭教学点行政办公室教务办公室行政办公室教务办公室行政办公室在该教育机构的OA系统中可以给各级办公室下发公文,现采用组合模式设计该机构的组织结构,绘制相应的类图并编程模拟实现,在客户端代码中模拟下发公文。
(注:可以定义一个办公室类为抽象叶子构件类,再将教务办公室和行政办公室作为其子类;可以定义一个教学机构类为抽象容器构件类,将总部、分校和教学点作为其子类。
)(3) 外观模式某系统需要提供一个文件加密模块,加密流程包括三个操作,分别是读取源文件、加密、保存加密之后的文件。
读取文件和保存文件使用流来实现,这三个操作相对独立,其业务代码封装在三个不同的类中。
现在需要提供一个统一的加密外观类,用户可以直接使用该加密外观类完成文件的读取、加密和保存三个操作,而不需要与每一个类进行交互,使用外观模式设计该加密模块,要求编程模拟实现。
设计模式之装饰模式实验报告第七组一、实验目的用java实现一个装饰模式,加深对装饰模式的理解。
二、实验内容在一个学校中,教师类ITeacher()具有教书方法teach()。
现需要动态给对象CTeacher ()添加J2EETeacher()方法。
使用装饰模式设计该系统,绘制类图并编程实现。
三、实验步骤实验步骤:(算法描述、源程序、操作步骤和方法)第一步:进入实验系统,创建Java 项目;第二步:按照实验指导书的内容,创建需要的各个类;第三步;编写每一个类的代码;第四步:对自己创建的Java项目进行调试;Java代码:ITeacher,javapackage ;public interface ITeacher {public void teach();}ITeacher.javapackage ;public class CTeacher implements ITeacher {ITeacher teacher;public CTeacher(){}public CTeacher(ITeacher teacher){this.teacher = teacher;}@Overridepublic void teach() {System.out.println("我能教C++");//this.teacher.teach();}}J2EETeacher.javapackage ;public class J2EETeacher implements ITeacher { ITeacher teacher;public J2EETeacher(){}public J2EETeacher(ITeacher teacher){this.teacher = teacher;}@Overridepublic void teach() {System.out.println("我能教J2EE");this.teacher.teach();}}Client.javapackage ;public class Client {public static void main(String[] args) { CTeacher c = new CTeacher();J2EETeacher cj = new J2EETeacher(c);cj.teach();}}四、运行结果五、类图。
实验1 UML实验(1)实验学时: 2每组人数: 1实验类型: 3 (1:基础性2:综合性3:设计性4:研究性)实验要求: 1 (1:必修2:选修3:其它)实验类别: 3 (1:基础2:专业基础3:专业4:其它)一、实验目的1.学会安装和使用建模工具Po werDesi gner,熟练使用PowerDesi gner绘制常用的UML图形,熟悉常用的UM L符号;2.构建用例模型来描述软件需求,包括绘制用例图,撰写用例文档并制作用例检查矩阵;3. 绘制状态图描述对象的状态及转换。
二、实验内容1. 某酒店订房系统描述如下:(1) 顾客可以选择在线预订,也可以直接去酒店通过前台服务员预订;(2) 前台服务员可以利用系统直接在前台预订房间;(3) 不管采用哪种预订方式,都需要在预订时支付相应订金;(4) 前台预订可以通过现金或信用卡的形式进行订金支付,但是网上预订只能通过信用卡进行支付;(5) 利用信用卡进行支付时需要和信用卡系统进行通信;(6) 客房部经理可以随时查看客房预订情况和每日收款情况。
绘制该酒店订房系统的用例图。
2. 根据以下场景绘制用例图:某企业为了方便员工用餐,为企业餐厅开发了一个订餐系统(COS:Cafeteri a Orderin g System),企业员工可通过企业内联网使用该系统。
该系统功能描述如下:(1) 企业的任何员工都可以查看菜单和今日特价;(2) 系统的顾客是注册到系统的员工,可以在线订餐(以下操作均需先登录)、注册工资支付、修改订餐信息和删除订餐信息,在注册工资支付时需要通过工资系统进行身份验证;(3) 餐厅员工是特殊的顾客,可以进行备餐(系统记录备餐信息)、生成付费请求和请求送餐,其中对于注册使用工资支付的顾客生成付费请求并发送给工资系统;(4) 菜单管理员是餐厅员工的一种,可以管理菜单;(5) 送餐员也是餐厅员工的一种,可以打印送餐说明、记录送餐信息(如送餐时间)以及记录收费(对于没有注册工资支付的顾客,由送餐员收取现金后记录)。
淮海工学院计算机工程学院实验报告书
课程名:《UML理论及实践》
题目:正向工程
班级:Z计121
学号:2014140093
姓名:薛慧君
一、目的与要求
1、熟悉面向对象原则,熟悉GoF中的模式;
2、会初步使用设计模式解决实际问题;
3、掌握正向工程、逆向工程概念;
4、掌握使用Rose画出类图、交互图等来描述设计模型;
5、掌握使用Rose从设计模型使用正向工程,得到代码框架;
6、掌握使用Rose从代码使用逆向工程,得到设计模型,并文档化Project。
二、实验内容或题目
假设有一CAD系统,可能需要绘制处理若干图形(如矩形、圆形、三角形……);而画图程序有若干版本,画图的工作需要依赖于具体的机器型号,新机器可以使用新的画图程序,旧的机器只能使用老版本的程序,请使用桥模式为本系统设计一个方案:请在Rational Rose中给出设计类图,并使用正向工程生成代码框架;在生成的代码中修改后再使用逆向工程,重新生成设计模型。
三、实验步骤及结果
CAD系统设计模型的类图;
四、结果分析与实验体会
通过本次实验,我掌握了:
(1)桥模式:将抽象部分与实现部分分离,使它们都可以独立的变化。
(2)桥模式适用性:①不希望在抽象和实现部分之间有一个固定的绑架关系②类的抽象以及实现都可以通过生成子类的方法加以扩充③对抽象的实现部分的修改应不会对客户产
生影响④对客户完全隐藏抽象的实现⑤有许多类要生成⑥在多个对象间共享实现,同时对客户隐藏这种实现机制
(3)桥模式实现要点:分别定义抽象的接口和实现的接口,抽象接口中聚合一个实现接口的引用,该引用就是连接接口和实现的桥梁。
实验二:工厂模式实验内容简单工厂方法模式:利用简单工厂方法模式创建pad, phone, watch的对象,并使用这些对象娱乐。
工厂模式:利用工厂模式创建pad, phone, watch的对象,并使用这些对象娱乐。
抽象工厂模式:利用抽象工厂模式创建华为、小米、苹果的pad, phone, watch的对象,并使用这些对象娱乐。
简单工厂方法模式设计图1简单工厂模式类图核心代码ConsumerElectronics.java核心代码Pad.java核心代码Watch.java核心代码Phone.java核心代码ConsumerElectronicsFactory.java核心代码实现效果图 2 简单工厂模式实现效果图工厂模式设计图 3 工厂模式类图核心代码ConsumerElectronicsFactory.java核心代码PadFactory.java核心代码WatchFactory.java核心代码PhoneFactory.java核心代码实现效果图4 工厂模式实现效果图抽象工厂模式设计图5抽象工厂模式类图核心代码AbstractFactory.java核心代码AppleFactory.java核心代码HuaweiFactory.java核心代码MiFactory.java核心代码实现效果图 6 抽象工厂模式实现效果图实验体会做完这次试验,下面是我的一些体会:首先,工厂模式是为了解耦:把对象的创建和使用的过程分开。
其次,工厂模式可以降低代码重复。
如果创建对象的过程都很复杂,需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。
我们可以这些创建对象的代码放到工厂里统一管理。
既减少了重复代码,也方便以后对该对象的创建过程的修改维护。
由于创建过程都由工厂统一管理,所以发生业务逻辑变化,不需要逐个修正,只需要在工厂里修改即可,降低维护成本。
另外,因为工厂管理了对象的创建逻辑,使用者并不需要知道具体的创建过程,只管使用即可,减少了使用者因为创建逻辑导致的错误。
一、实验名称【实验名称】二、实验目的1. 熟悉【实验目的1】。
2. 掌握【实验目的2】。
3. 了解【实验目的3】。
三、实验原理【实验原理简介】四、实验仪器与材料1. 仪器:- 【仪器1】- 【仪器2】- 【仪器3】- ...2. 材料:- 【材料1】- 【材料2】- 【材料3】- ...五、实验方法与步骤1. 实验方法【简要描述实验方法】2. 实验步骤1) 准备工作:- 【步骤1】- 【步骤2】- 【步骤3】- ...2) 实验操作:- 【步骤4】- 【步骤5】- 【步骤6】- ...3) 数据记录与分析:- 【步骤7】- 【步骤8】- 【步骤9】- ...六、实验数据记录与分析1. 实验数据记录【在此处记录实验过程中观察到的数据,如表格、图表等形式】2. 数据分析【根据实验数据进行分析,包括但不限于以下内容】- 对比实验前后数据的变化- 分析实验结果与预期目标的关系- 探讨实验中可能存在的问题及原因七、实验结果与讨论1. 实验结果【在此处描述实验结果,包括但不限于以下内容】- 实验现象描述- 数据分析结果- 与预期目标的一致性2. 讨论【对实验结果进行讨论,包括但不限于以下内容】- 分析实验结果背后的原理- 探讨实验过程中遇到的问题及解决方法- 对实验结果的进一步分析及改进建议八、实验结论【总结实验结果,得出实验结论】九、实验心得与体会【总结实验过程中的收获与体会,包括但不限于以下内容】- 对实验原理和方法的深入理解- 实验操作技能的提升- 团队合作的重要性- 实验过程中遇到的问题及解决策略十、参考文献【列出实验过程中参考的文献】【注】以上模板仅供参考,具体实验报告内容需根据实际实验情况进行调整。
设计模式实验报告(一)课程名称: ___设计模式__ _实验名称:__创建型与结构型模式专业: 计算机科学与技术学号:姓名:实验日期:2012.4.09工厂模式一、实验目的:1、学习工厂模式设计2、学习抽象工厂模式设计3、学习建造者模式设计4、学习单例模式二、运行环境:Microsoft Visual Studio 2010三、实验内容1、工厂模式模式定义:在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
实例说明:为了让增加新品牌电视机更加方便,可以通过工厂方法模式对该电视机厂进行进一步重构。
可以将原有的工厂进行分割,为每种品牌的电视机提供一个子工厂,海尔工厂专门负责生产海尔电视机,海信工厂专门负责生产海型电视机,如果需要生产TCL电视机,只需要对应增加一个新的TCL工厂即可,原有的工厂无需做任何修改,使得整个系统具有更好的灵活性和可扩展性。
①源代码:Class1:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows.Forms;namespace工厂模式?{public interface TV{void play();}public class HaierTV : TV{public void play(){MessageBox.Show("海£尔?电?视酣?播¥放?中D");}}public class HisenseTV : TV{public void play(){MessageBox.Show("海£信?电?视酣?播¥放?中D");}}public interface TVFactory{TV produceTV();}public class HaierTVFactory : TVFactory{public TV produceTV(){MessageBox.Show("海£尔?电?视酣?工¤厂§生Θ?产ú海£信?电?视酣?机ú");return new HaierTV();}}public class HisenseTVFactory : TVFactory{public TV produceTV(){MessageBox.Show("海£信?电?视酣?工¤厂§生Θ?产ú海£信?电?视酣?机ú");return new HisenseTV();}}class Class1{}}Form1.csusing System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace工¤厂§模£式?{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e) {TV tv;TVFactory factory;factory = new HaierTVFactory (); //唯¨一?不?一?样ù的?地?方?tv=factory.produceTV ();tv .play ();}private void button2_Click(object sender, EventArgs e) {TV tv;TVFactory factory;factory = new HisenseTVFactory(); //唯¨一?不?一?样ù的?地?方?tv = factory.produceTV();tv.play();}}}②运行结果:主界面:点击“海尔电视”按钮后:再点击“确定”后:点击“海信电视”按钮后:点击“确定”按钮后:2、抽象工厂模式模式定义:提供一个创建一系列相关或相互依赖对象的接口,且无需指定他们具体的类。
一、实验名称[实验名称]二、实验目的1. 确定实验的研究目标和预期成果。
2. 了解实验设计的基本原则和方法。
3. 培养实验者的创新思维和问题解决能力。
三、实验原理1. 简述实验的理论依据和基本原理。
2. 引用相关文献或资料,说明实验的理论基础。
四、实验器材1. 列出实验所需的器材及规格。
2. 说明器材的来源和用途。
五、实验步骤1. 实验前准备a. 实验器材的准备与检查。
b. 实验场所的布置。
c. 实验数据的记录表格准备。
2. 实验实施a. 按照实验步骤进行操作。
b. 记录实验过程中的关键数据和现象。
c. 对实验中出现的问题进行分析和解决。
3. 实验结果处理a. 对实验数据进行整理和分析。
b. 利用图表、公式等方法展示实验结果。
c. 对实验结果进行解释和讨论。
六、实验数据1. 列出实验过程中记录的数据。
2. 对数据进行必要的计算和统计。
七、实验结果与分析1. 实验结果的描述a. 用文字和图表描述实验结果。
b. 说明实验结果是否符合预期。
2. 实验结果的分析a. 分析实验结果的原因和影响因素。
b. 对实验结果进行评价和总结。
八、实验讨论1. 对实验过程中遇到的问题进行分析和讨论。
2. 对实验结果的局限性进行说明。
3. 对实验设计的改进提出建议。
九、结论1. 总结实验的主要成果和发现。
2. 强调实验的创新点和实际应用价值。
十、参考文献1. 列出实验过程中引用的文献资料。
2. 按照规范格式进行著录。
十一、附录1. 实验过程中使用的图表、数据等补充材料。
2. 实验过程中产生的原始记录、计算过程等。
注:以上为设计型实验报告的一般格式,具体内容可根据实验性质和需求进行调整。
字数约为2500字。
预备实验UML建模实验目的:加深对UML建模的理解实验环境:MyEclipse(Java)或Rational Rose等实验内容:1、需求描述A.某学校准备开发一套选课管理系统,其主要用户是教师和学生。
假设教师可以查看课程、增加课程和修改课程;学生可以选修一门或多门课程(为简化起见,学生选修某课程后不允许修改和删除),还能够查看所选修课程的成绩。
其中:课程可由课程编号、课程名称进行描述;教师可用工号和姓名进行描述;学生可用学号、姓名进行描述。
B. 某信用卡系统账户具有使用状态和冻结状态,其中使用状态又包括正常状态和透支状态两种子状态。
如果账户余额小于零则进入透支状态,透支状态时既可以存款又可以取款,但是透支金额不能超过5000元;如果余额大于零则进入正常状态,正常状态时既可以存款又可以取款;如果连续透支100天,则进入冻结状态,冻结状态下既不能存款又不能取款,必须要求银行工作人员解冻。
用户可以在使用状态或冻结状态下请求注销账户。
根据上述要求,绘制账户类的状态图。
2、用例图根据上面的需求描述A,运用UML画出用例图。
画图中的用例名和参与者均用中文表示;3、类图根据上面的需求描述A,运用UML画出初始设计类图(仅含业务类),图中应给出属性和方法的中文名称,类与类之间若存在关联,可不确定关联的方向,但需要标出这些关联的多重性。
4、状态图根据上面的需求描述B,运用UML画出状态图实验2 单一职责原则训练实验目的:加深对单一职责原则的理解实验环境:C#.Net/VC++.Net或MyEclipse(Java)等实验内容:1、实例说明某基于Java的C/S系统的“登录功能”通过如下登录类(Login)实现:现使用单一职责原则对其进行重构,并编程实现(可仿真实现数据数据库DAO 形式,当然如果能实现真实的数据库连接并进行数据库的操纵更好)。
package Experiment_One_Code;import java.sql.*;/**** @author Author**/public class DBUtil {public static Connection getConnction() {Connection dbConnection = null;try {Class.forName(DRIVER_CLASS);dbConnection = DriverManager.getConnection(DATABASE_URL,DATABASE_USRE, DATABASE_PASSWORD);} catch (Exception e) {e.printStackTrace();}return dbConnection;}}package Experiment_One_Code;/**** @author Author**/public class UserDAO {private DBUtil db = new DBUtil();private String userName;private String userPassword;public boolean findUser(String userName, String userPassword) { return false;}}package Experiment_One_Code;/**** @author Author**/public class LoginForm {public LoginForm(UserDAO dao) {super();this.dao = dao;}public LoginForm() {super();}UserDAO dao = new UserDAO();public void init() {}public void display() {}public void validate() {}}package Experiment_One_Code;/**** @author Author**/public class MainClass {public static void main(String[] args) { // TODO Auto-generated method stubLoginForm loginForm = new LoginForm();loginForm.init();loginForm.display();loginForm.validate();}}2、实例说明某图形处理系统通过如下类实现:package compute.area_circle.HKT;/**** @author Author1* @date 2019-04-02 上午11:26:41* 正方形类*/public class squareClass {public void Draw() {System.out.println("画一个正方形!");}public void Area() {System.out.println("计算正方形的面积!");}}package compute.area_circle.HKT;/**** @author Author1* @date 2019-04-02 上午11:49:50**/public class figure_Draw_Program {public static void main(String[] args) { // TODO Auto-generated method stubsquareClass square1 = new squareClass();square1.Draw();}}package compute.area_circle.HKT;/*** @author Author1* @date 2019-04-02 上午11:38:47**/public class figure_Compute_Program { /*** @param args*/public static void main(String[] args) { // TODO Auto-generated method stubsquareClass square = new squareClass();square.Area();}}现使用单一职责原则对其进行重构。
察看:要求编程实现以上二种体系结构,并比较二种实现的差异。
package compute.area.draw.improve;public interface IAbstractSquare {public void Area();public void Draw();}package compute.area.draw.improve;public class figure_Compute_Program implements IAbstractSquare { @Overridepublic void Area() {// TODO Auto-generated method stubSystem.out.println("计算正方形的面积!");}@Overridepublic void Draw() {// TODO Auto-generated method stub}}package compute.area.draw.improve;public class figure_Draw_Program implements IAbstractSquare { @Overridepublic void Area() {// TODO Auto-generated method stub}@Overridepublic void Draw() {// TODO Auto-generated method stubSystem.out.println("画一个正方形!");}}实验2 开闭原则与里氏代换原则综合训练实验目的:加深对开闭原则与里氏代换原则的理解(如果你能用配置文件,建议用配置文件解决。
)实验环境:C#.Net/VC++.Net或MyEclipse(Java)等实验内容:1、问题(一)“长方形和正方形“。
试写一个求面积与周长的解决方案,要求画UML图并编程实现,并体现出开闭原则与里氏代换原则。
IbstractCompute.javapackage desinMode.experiment2.code;/**** @author Author1* @date 2019-04-09 上午11:32:57**/public abstract class IbstractCompute {//计算周长函数public abstract void computePerimeter();//计算面积函数public abstract void computeArea();}computeRectangle.javapackage desinMode.experiment2.code;/**** @author Author1* @date 2019-04-09 上午11:46:38**/public class computeRectangle extends IbstractCompute {public void computePerimeter() {System.out.println("继承抽象类,实现抽象方法计算长方形的周长(实现开闭原则与里氏代换原则)");}//计算面积函数public void computeArea() {System.out.println("继承抽象类,实现抽象方法计算长方形的面积(实现开闭原则与里氏代换原则)");}}computeSquare.javapackage desinMode.experiment2.code;/**** @author Author1* @date 2019-04-09 上午11:46:45**/public class computeSquare extends IbstractCompute {//计算周长函数public void computePerimeter() {System.out.println("继承抽象类,实现抽象方法计算正方形的周长(实现开闭原则与里氏代换原则)");}//计算面积函数public void computeArea() {System.out.println("继承抽象类,实现抽象方法计算正方形的面积(实现开闭原则与里氏代换原则)");}}mainClass.javapackage desinMode.experiment2.code;/**** @author Author1* @date 2019-04-09 上午11:46:57*/public class mainClass {public static void main(String[] args) { // TODO Auto-generated method stubIbstractCompute ibstractCompute = null;//开闭原则与里氏代换原则正方形ibstractCompute = new computeSquare();putePerimeter();puteArea();////开闭原则与里氏代换原则长方形ibstractCompute = new computeRectangle();putePerimeter();puteArea();}}2、问题(二)“士兵用枪杀敌”UML图理解与编程实现(1)CS游戏中的枪械类图Client.javapackage desinMode.experiment2.question_2;/**** @author Author1* @date 2019-04-13 上午11:02:30**/public class Client {public static void main(String[] args) {// TODO Auto-generated method stubAbstractGun abstractGun1 = new Handgun();AbstractGun abstractGun2 = new Rifle();AbstractGun abstractGun3 = new Machinegun();Soldier soldier = new Soldier();soldier.killEnemy(abstractGun1);soldier.killEnemy(new Rifle());soldier.killEnemy(new Machinegun());}}Soldier.javapackage desinMode.experiment2.question_2;/**** @author Author1* @date 2019-04-13 上午11:03:06**/public class Soldier {public void killEnemy(AbstractGun abstractGun) { System.out.print("士兵用");abstractGun.shoot();System.out.println("杀死敌人");}}AbstractGun.javapackage desinMode.experiment2.question_2;/**** @author Author1* @date 2019-04-13 上午11:02:46**/public abstract class AbstractGun {public abstract void shoot();}Handgun.javapackage desinMode.experiment2.question_2;/**** @author Author1* @date 2019-04-13 上午10:49:20**/public class Handgun extends AbstractGun { public void shoot() {System.out.print("手枪");}}Machinegun.javapackage desinMode.experiment2.question_2;/**** @author Author1* @date 2019-04-13 上午11:02:54**/public class Machinegun extends AbstractGun { public void shoot() {System.out.print("机械枪");}}Rifle.javapackage desinMode.experiment2.question_2;/**** @author Author1* @date 2019-04-13 上午11:03:00**/public class Rifle extends AbstractGun { public void shoot() {System.out.print("步枪");}}(2)如果我们有一个玩具手枪,该如何定义呢?先在上图增加一个类ToyGun,然后继承于AbstractGun类Client.javapackage desinMode.experiment2.question_2;/**** @author Author1* @date 2019-04-13 上午11:02:30**/public class Client {public static void main(String[] args) {// TODO Auto-generated method stubAbstractGun abstractGun1 = new Handgun();AbstractGun abstractGun2 = new Rifle();AbstractGun abstractGun3 = new Machinegun();Soldier soldier = new Soldier();soldier.killEnemy(abstractGun1);soldier.killEnemy(new Rifle());soldier.killEnemy(new Machinegun());soldier.killEnemy(new Toygun());}}Toygun.javapackage desinMode.experiment2.question_2;/**** @author Author1* @date 2019-04-13 上午11:13:59**/public class Toygun extends AbstractGun { public void shoot() {System.out.print("玩具枪");}}(3)具枪与真实枪分离的类图Client.javapackage desinMode.experiment2.question_2;/**** @author Author1* @date 2019-04-13 上午11:02:30**/public class Client {public static void main(String[] args) { // TODO Auto-generated method stubAbstractGun abstractGun1 = new Handgun();AbstractGun abstractGun2 = new Rifle();AbstractGun abstractGun3 = new Machinegun();Soldier soldier = new Soldier();soldier.killEnemy(abstractGun1);soldier.killEnemy(new Rifle());soldier.killEnemy(new Machinegun());}}Soldier.javapackage desinMode.experiment2.question_2;/**** @author Author1* @date 2019-04-13 上午11:03:06**/public class Soldier {public void killEnemy(AbstractGun abstractGun) { System.out.print("士兵用");abstractGun.shoot();System.out.println("杀死敌人");}}AbstractGun.javapackage desinMode.experiment2.question_2;/**** @author Author1* @date 2019-04-13 上午11:02:46**/public abstract class AbstractGun {public abstract void shoot();}Handgun.javapackage desinMode.experiment2.question_2;/**** @author Author1* @date 2019-04-13 上午10:49:20**/public class Handgun extends AbstractGun { public void shoot() {System.out.print("手枪");}}Machinegun.javapackage desinMode.experiment2.question_2;/**** @author Author1* @date 2019-04-13 上午11:02:54**/public class Machinegun extends AbstractGun { public void shoot() {System.out.print("机械枪");}}Rifle.javapackage desinMode.experiment2.question_2;/**** @author Author1* @date 2019-04-13 上午11:03:00**/public class Rifle extends AbstractGun { public void shoot() {System.out.print("步枪");}}AbstractToyGun.javapackage desinMode.experiment2.question_2;public abstract class AbstractToyGun {public abstract void toyShoot(AbstractGun abstractGun);}Toygun2.javapackage desinMode.experiment2.question_2;public class Toygun2 extends AbstractToyGun{public void toyShoot(AbstractGun abstractGun) {abstractGun.shoot();System.out.println("玩具枪");}}实验3 依赖倒转原则与开闭原则的综合训练实验目的:加深对依赖倒转原则与开闭原则的理解实验环境:C#.Net/VC++.Net或MyEclipse(Java)等实验内容:1、依赖倒置原则的理解所谓依赖倒置原则(Dependence Inversion Principle )就是要依赖于抽象,不要依赖于具体。