设计模式实验报告.docx
- 文档编号:6115949
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:130
- 大小:1.49MB
设计模式实验报告.docx
《设计模式实验报告.docx》由会员分享,可在线阅读,更多相关《设计模式实验报告.docx(130页珍藏版)》请在冰豆网上搜索。
设计模式实验报告
预备实验UML建模
实验目的:
加深对UML建模的理解
实验环境:
MyEclipse(Java)或RationalRose等
实验内容:
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形式,当然如果能实现真实的数据库连接并进行数据库的操纵更好)。
packageExperiment_One_Code;
importjava.sql.*;
/**
*
*@authorAuthor
*
*/
publicclassDBUtil{
publicstaticConnectiongetConnction(){
ConnectiondbConnection=null;
try{
Class.forName(DRIVER_CLASS);
dbConnection=DriverManager.getConnection(DATABASE_URL,
DATABASE_USRE,DATABASE_PASSWORD);
}catch(Exceptione){
e.printStackTrace();
}
returndbConnection;
}
}
packageExperiment_One_Code;
/**
*
*@authorAuthor
*
*/
publicclassUserDAO{
privateDBUtildb=newDBUtil();
privateStringuserName;
privateStringuserPassword;
publicbooleanfindUser(StringuserName,StringuserPassword){
returnfalse;
}
}
packageExperiment_One_Code;
/**
*
*@authorAuthor
*
*/
publicclassLoginForm{
publicLoginForm(UserDAOdao){
super();
this.dao=dao;
}
publicLoginForm(){
super();
}
UserDAOdao=newUserDAO();
publicvoidinit(){
}
publicvoiddisplay(){
}
publicvoidvalidate(){
}
}
packageExperiment_One_Code;
/**
*
*@authorAuthor
*
*/
publicclassMainClass{
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
LoginFormloginForm=newLoginForm();
loginForm.init();
loginForm.display();
loginForm.validate();
}
}
2、实例说明
某图形处理系统通过如下类实现:
packagecompute.area_circle.HKT;
/**
*
*@authorAuthor1
*@date2019-04-02上午11:
26:
41
*正方形类
*/
publicclasssquareClass{
publicvoidDraw(){
System.out.println("画一个正方形!
");
}
publicvoidArea(){
System.out.println("计算正方形的面积!
");
}
}
packagecompute.area_circle.HKT;
/**
*
*@authorAuthor1
*@date2019-04-02上午11:
49:
50
*
*/
publicclassfigure_Draw_Program{
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
squareClasssquare1=newsquareClass();
square1.Draw();
}
}
packagecompute.area_circle.HKT;
/**
*@authorAuthor1
*@date2019-04-02上午11:
38:
47
*
*/
publicclassfigure_Compute_Program{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
squareClasssquare=newsquareClass();
square.Area();
}
}
现使用单一职责原则对其进行重构。
察看:
要求编程实现以上二种体系结构,并比较二种实现的差异。
packagecompute.area.draw.improve;
publicinterfaceIAbstractSquare{
publicvoidArea();
publicvoidDraw();
}
packagecompute.area.draw.improve;
publicclassfigure_Compute_ProgramimplementsIAbstractSquare{
@Override
publicvoidArea(){
//TODOAuto-generatedmethodstub
System.out.println("计算正方形的面积!
");
}
@Override
publicvoidDraw(){
//TODOAuto-generatedmethodstub
}
}
packagecompute.area.draw.improve;
publicclassfigure_Draw_ProgramimplementsIAbstractSquare{
@Override
publicvoidArea(){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidDraw(){
//TODOAuto-generatedmethodstub
System.out.println("画一个正方形!
");
}
}
实验2开闭原则与里氏代换原则综合训练
实验目的:
加深对开闭原则与里氏代换原则的理解(如果你能用配置文件,建议用配置文件解决。
)
实验环境:
C#.Net/VC++.Net或MyEclipse(Java)等
实验内容:
1、问题
(一)“长方形和正方形“。
试写一个求面积与周长的解决方案,要求画UML图并编程实现,并体现出开闭原则与里氏代换原则。
IbstractCompute.java
packagedesinMode.experiment2.code;
/**
*
*@authorAuthor1
*@date2019-04-09上午11:
32:
57
*
*/
publicabstractclassIbstractCompute{
//计算周长函数
publicabstractvoidcomputePerimeter();
//计算面积函数
publicabstractvoidcomputeArea();
}
computeRectangle.java
packagedesinMode.experiment2.code;
/**
*
*@authorAuthor1
*@date2019-04-09上午11:
46:
38
*
*/
publicclasscomputeRectangleextendsIbstractCompute{
publicvoidcomputePerimeter(){
System.out.println("继承抽象类,实现抽象方法计算长方形的周长(实现开闭原则与里氏代换原则)");
}
//计算面积函数
publicvoidcomputeArea(){
System.out.println("继承抽象类,实现抽象方法计算长方形的面积(实现开闭原则与里氏代换原则)");
}
}
computeSquare.java
packagedesinMode.experiment2.code;
/**
*
*@authorAuthor1
*@date2019-04-09上午11:
46:
45
*
*/
publicclasscomputeSquareextendsIbstractCompute{
//计算周长函数
publicvoidcomputePerimeter(){
System.out.println("继承抽象类,实现抽象方法计算正方形的周长(实现开闭原则与里氏代换原则)");
}
//计算面积函数
publicvoidcomputeArea(){
System.out.println("继承抽象类,实现抽象方法计算正方形的面积(实现开闭原则与里氏代换原则)");
}
}
mainClass.java
packagedesinMode.experiment2.code;
/**
*
*@authorAuthor1
*@date2019-04-09上午11:
46:
57
*
*/
publicclassmainClass{
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
IbstractComputeibstractCompute=null;
//开闭原则与里氏代换原则正方形
ibstractCompute=newcomputeSquare();
ibstractCputePerimeter();
ibstractCputeArea();
////开闭原则与里氏代换原则长方形
ibstractCompute=newcomputeRectangle();
ibstractCputePerimeter();
ibstractCputeArea();
}
}
2、问题
(二)“士兵用枪杀敌”UML图理解与编程实现
(1)CS游戏中的枪械类图
Client.java
packagedesinMode.experiment2.question_2;
/**
*
*@authorAuthor1
*@date2019-04-13上午11:
02:
30
*
*/
publicclassClient{
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
AbstractGunabstractGun1=newHandgun();
AbstractGunabstractGun2=newRifle();
AbstractGunabstractGun3=newMachinegun();
Soldiersoldier=newSoldier();
soldier.killEnemy(abstractGun1);
soldier.killEnemy(newRifle());
soldier.killEnemy(newMachinegun());
}
}
Soldier.java
packagedesinMode.experiment2.question_2;
/**
*
*@authorAuthor1
*@date2019-04-13上午11:
03:
06
*
*/
publicclassSoldier{
publicvoidkillEnemy(AbstractGunabstractGun){
System.out.print("士兵用");
abstractGun.shoot();
System.out.println("杀死敌人");
}
}
AbstractGun.java
packagedesinMode.experiment2.question_2;
/**
*
*@authorAuthor1
*@date2019-04-13上午11:
02:
46
*
*/
publicabstractclassAbstractGun{
publicabstractvoidshoot();
}
Handgun.java
packagedesinMode.experiment2.question_2;
/**
*
*@authorAuthor1
*@date2019-04-13上午10:
49:
20
*
*/
publicclassHandgunextendsAbstractGun{
publicvoidshoot(){
System.out.print("手枪");
}
}
Machinegun.java
packagedesinMode.experiment2.question_2;
/**
*
*@authorAuthor1
*@date2019-04-13上午11:
02:
54
*
*/
publicclassMachinegunextendsAbstractGun{
publicvoidshoot(){
System.out.print("机械枪");
}
}
Rifle.java
packagedesinMode.experiment2.question_2;
/**
*
*@authorAuthor1
*@date2019-04-13上午11:
03:
00
*
*/
publicclassRifleextendsAbstractGun{
publicvoidshoot(){
System.out.print("步枪");
}
}
(2)如果我们有一个玩具手枪,该如何定义呢?
先在上图增加一个类ToyGun,然后继承于AbstractGun类
Client.java
packagedesinMode.experiment2.question_2;
/**
*
*@authorAuthor1
*@date2019-04-13上午11:
02:
30
*
*/
publicclassClient{
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
AbstractGunabstractGun1=newHandgun();
AbstractGunabstractGun2=newRifle();
AbstractGunabstractGun3=newMachinegun();
Soldiersoldier=newSoldier();
soldier.killEnemy(abstractGun1);
soldier.killEnemy(newRifle());
soldier.killEnemy(newMachinegun());
soldier.killEnemy(newToygun());
}
}
Toygun.java
packagedesinMode.experiment2.question_2;
/**
*
*@authorAuthor1
*@date2019-04-13上午11:
13:
59
*
*/
publicclassToygunextendsAbstractGun{
publicvoidshoot(){
System.out.print("玩具枪");
}
}
(3)具枪与真实枪分离的类图
Client.java
packagedesinMode.experiment2.question_2;
/**
*
*@authorAuthor1
*@date2019-04-13上午11:
02:
30
*
*/
publicclassClient{
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
AbstractGunabstractGun1=newHandgun();
AbstractGunabstractGun2=newRifle();
AbstractGunabstractGun3=newMachinegun();
Soldiersoldier=newSoldier();
soldier.killEnemy(abstractGun1);
soldier.killEnemy(newRifle());
soldier.killEnemy(newMachinegun());
}
}
Soldier.java
packagedesinMode.experiment2.question_2;
/**
*
*@authorAuthor1
*@date2019-04-13上午11:
03:
06
*
*/
publicclassSoldier{
publicvoidkillEnemy(AbstractGunabstractGun){
System.out.print("士兵用");
abstractGun.shoot();
System.out.println("杀死敌人");
}
}
AbstractGun.java
packagedesinMode.experiment2.question_2;
/**
*
*@authorAuthor1
*@date2019-04-13上午11:
02:
46
*
*/
publicabstractclassAbstractGun{
publicabstractvoidshoot();
}
Handgun.java
packagedesinMode.experiment2.question_2;
/**
*
*@authorAuthor1
*@date2019-04-13上午10:
49:
20
*
*/
publicclassHandgunextendsAbstractGun{
publicvoidshoot(){
System.out.print("手枪");
}
}
Machinegun.java
packagedesinMode.experiment2.question_2;
/**
*
*@authorAuthor1
*@date2019-04-13上午11:
02:
54
*
*/
publicclassMachinegunextendsAbstractGun{
publicvoidshoot(){
System.out.print("机械枪");
}
}
Rifle.java
packagedesinMode.experiment2.question_2;
/**
*
*@authorAuthor1
*@date2019-04-13上午11:
03:
00
*
*/
publicclass
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 模式 实验 报告