[面向对象系统分析和设计综合实验报告4]面向对象程序设计实验报告
时间:2020-07-25 17:04:16 来源:天一资源网 本文已影响 人
精品文档
实验名称:实验4 设计模型实验2 学期:2017-2018学年 第二学期
一、实验目的1.熟练使用面向对象设计原则对系统进行重构;
2.熟练使用面向对象编程语言(JAVA或C++)实现几种常见的设计模式,包括单例模式、策略模式、装饰模式和适配器模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。
二、实验要求
1. 选择合适的面向对象设计原则对系统进行重构,正确无误地绘制重构之后的类图;
2. 结合实例,正确无误地绘制单例模式、策略模式、装饰模式和适配器模式的结构图;
3. 实现单例模式、策略模式、装饰模式和适配器模式,代码运行正确无误。
三、实验内容
1. 现实生活中,居民身份证号码具有唯一性,同一个人不允许有多个身份证号码,第一次申请身份证时将号码分配给居民,如果之后因为遗失等原因补办时,还是使用原来的身份证号码,不会产生新号码,现使用单例模式模拟该场景。
类图
实现代码:
public class IdClient {
public static void main(String[] args) {
IdentityCardNo.getInstance();
IdentityCardNo.getInstance();
}
}
package Refactoring1;
public class IdentityCardNo {
private static IdentityCardNo instance;
private String no;
private IdentityCardNo() {
}
public static IdentityCardNo getInstance() {
if (instance == null) {
System.out.println("第一次办理身份证,分配新号码");
instance = new IdentityCardNo();
instance.setNo("No6000654321");
System.out.println("身份证号码为:" + instance.getNo());
} else {
System.out.println("重复办理身份证,获取旧号码!");
}
return instance;
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
}
2. 每一麻将局都有两个骰子,因此骰子就应当是双例类。现使用多例模式模拟该场景。
类图
实现代码:
import java.util.Date;
import java.util.Random;
public class Dice {
private static Dice die1 = new Dice();
private static Dice die2 = new Dice();
private Dice() {
}
public static Dice getInstance(int whichOne) {
if (whichOne == 1) {
return die1;
} else {
return die2;
}
}
public synchronized int dice() {
Date d = new Date();
Random r = new Random(d.getTime());
int value = r.nextInt();
value = Math.abs(value);
value = value % 6;
value += 1;
return value;
}
}
import java.util.Random;
import java.util.Date;
public class DiceClient {
private static Dice die1, die2;
public static void main(String[] args) {
die1 = Dice.getInstance(1);
die2 = Dice.getInstance(2);
System.out.println("第一骰子骰出: " + die1.dice());
System.out.println("第二骰子骰出: " + die2.dice());
}
}
3. 某软件公司为某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供不同的电影票(MovieTicket)打折(Discount)方式,具体打折方案如下:
学生凭学生证可享受票价8折优惠;
年龄在10周岁及以下的儿童可享受每张票减免10元的优惠(原始票价需大于等于20元);
影院VIP用户除享受票价半价优惠外还可进行积分,积分累计到一定额度可换取电影院赠送的奖品。
该系统在将来可能还要根据需要引入新的打折方式。
试使用策略模式设计并编程模拟实现该影院售票系统。
类图
实现代码:
public interface Discount {
public double calculate(double price);
}
public class MovieTicket {
private double price;
private Discount discount; //维持一个对抽象折扣类的引用
public void setPrice(double price) {
this.price = price;
}
//注入一个折扣类对象
public void setDiscount(Discount discount) {
this.discount = discount;
}
public double getPrice() {
//调用折扣类的折扣价计算方法
return discount.calculate(this.price);
}
}
//VIP会员票折扣类:具体策略类
public class VIPDiscount implements Discount {
public double calculate(double price) {
System.out.println("VIP票:");
System.out.println("增加积分!");
return price * 0.5;
}
}
//学生票折扣类:具体策略类
public class StudentDiscount implements Discount {
public double calculate(double price) {
System.out.println("学生票:");
return price * 0.8;
}
}
//儿童票折扣类:具体策略类
public class ChildrenDiscount implements Discount {
public double calculate(double price) {
System.out.println("儿童票:");
return price - 10;
}
}
public class MoviceClient {
public static void main(String args[]) {
MovieTicket mt = new MovieTicket();
double originalPrice = 60.0;
double currentPrice;
mt.setPrice(originalPrice);
System.out.println("原始价为:" + originalPrice);
System.out.println("");
Discount discount =new VIPDiscount(); //vip 用户
mt.setDiscount(discount); //注入折扣对象
currentPrice = mt.getPrice();
System.out.println("折后价为:" + currentPrice);
discount =new StudentDiscount(); //学生用户
mt.setDiscount(discount); //注入折扣对象
currentPrice = mt.getPrice();
System.out.println("折后价为:" + currentPrice);
discount =new ChildrenDiscount(); //儿童用户
mt.setDiscount(discount); //注入折扣对象
currentPrice = mt.getPrice();
System.out.println("折后价为:" + currentPrice);
}
}
实现结果:
4. 某软件公司欲开发一款飞机模拟系统,该系统主要模拟不同种类飞机的飞行特征与起飞特征,需要模拟的飞机种类及其特征如表1所示:
表1 飞机种类及特征一览表
飞机种类
起飞特征
飞行特征
直升机(Helicopter)
垂直起飞(VerticalTakeOff)
亚音速飞行(SubSonicFly)
客机(AirPlane)
长距离起飞(LongDistanceTakeOff)
亚音速飞行(SubSonicFly)
歼击机(Fighter)
长距离起飞(LongDistanceTakeOff)
超音速飞行(SuperSonicFly)
鹞式战斗机(Harrier)
垂直起飞(VerticalTakeOff)
超音速飞行(SuperSonicFly)
为将来能够模拟更多种类的飞机,试采用策略模式设计并模拟实现该飞机模拟系统。
类图
实现代码:
public class plane {
private state state;//状态
public void settakeoffFeatures(state tFeatures){
this.state = tFeatures;
}
public void setplanetype(String type) {
if(type=="直升机")
state=new Helicopter();
else if(type=="客机"){
state=new AirPlane();
}
else if(type=="歼击机"){
state=new Fighter();
}
else if(type=="鹞式战斗机"){
state=new Harrier();
}
else{
state=null;
}
}
public void takeoff(){
state.takeOff();
}
public void fly(){
state.fly();
}
}
public class AirPlane implements state{
@Override
public String takeOff() {
System.out.println("长距离起飞");
return "长距离起飞";
}
@Override
public String fly() {
System.out.println("亚音速飞行");
return "亚音速飞行";
}
}
public class Fighter implements state{
@Override
public String takeOff() {
System.out.println("长距离起飞");
return "长距离起飞";
}
@Override
public String fly() {
System.out.println("超亚音速飞行");
return "超音速飞行";
}
}
public class Harrier implements state{
@Override
public String takeOff() {
System.out.println("垂直起飞");
return "垂直起飞";
}
@Override
public String fly() {
System.out.println("超亚音速飞行");
return "超音速飞行";
}
}
public class Helicopter implements state{
@Override
public String takeOff() {
System.out.println("垂直起飞");
return "垂直起飞";
}
@Override
public String fly() {
System.out.println("亚音速飞行");
return "亚音速飞行";
}
}
public interface state {
public String takeOff();//起飞
public String fly();//飞行
}
public class Client {
public static void main(String args[]) {
plane plane = new plane();
plane.setplanetype("歼击机");
plane.takeoff();
plane.fly();
}
}
实现结果:
5. 儿子、妈妈、父亲三人合作画一幅画,儿子负责画出一朵花的轮廓,妈妈负责涂上颜色、父亲负责将画裱在画框里。现请使用装饰模式模拟这个过程。?
类图
实现代码:
public interface painting {
public String Draw();
}
public class Son implements painting{
@Override
public String Draw() {
System.out.println("儿子用笔画出了花的轮廓");
return "儿子用笔画出了花的轮廓";
}
}
public class Father implements painting{
private painting painting;//被装饰者
public Father(painting painting) {
this.painting =painting;
}
private Father() {}
public void paint() {
//爸爸装饰者做的职责
System.out.println("爸爸正在做上画框前的准备工作");
painting.Draw();//爸爸装饰者做职责
System.out.println("父亲将画裱在画框里");
}
@Override
public String Draw() {
System.out.println("父亲将画裱在画框里");
return "父亲将画裱在画框里";
}
}
public class Mother implements painting{
private painting painting;//被装饰者
public Mother(painting painting) {
this.painting =painting;
}
private Mother() {}
public void paint() {
System.out.println("妈妈正在做给画上颜色前的准备工作。");
painting.Draw();//妈妈装饰者做的职责
System.out.println("妈妈给画上好了颜色");
}
@Override
public String Draw() {
System.out.println("妈妈给画上好了颜色");
return "妈妈给画上好了颜色";
}
}
public class Client {
public static void main(String[] args){
painting painting =new Son();
painting.Draw();
painting = new Mother(painting);
painting.Draw();
painting = new Father(painting);
painting.Draw(); }
}
实现结果:
6. 某公司想通过网络传输数据,但是担心文件被窃取。他们的所有数据都采用字符的方式传送。现在他们开发了一个数据加密模块,可以对字符串进行加密,以便数据更安全地传送。最简单的加密算法通过对字母向后移动6位来实现,同时还提供了稍复杂的逆向输出加密,还提供了更为高级的求模加密,让每一位与6求模。
用户先使用最简单的加密算法对字符串进行加密,再对加密之后的结果使用复杂加密算法进行二次加密,再对二次加密结果用高级加密算法进行第三次加密。现请使用装饰模式模拟这个过程。?
类图
实现代码:
public class ConcreteEncrypt implements EncryptComponet{
private EncryptComponet encryptComponet;
public ConcreteEncrypt(EncryptComponet encryptComponet) {
super();
this.encryptComponet = encryptComponet;
}
public void encrypt() {
encryptComponet.encrypt();
}
}
public interface EncryptComponet {
public abstract void encrypt();
}
public class RawData implements EncryptComponet{
public void encrypt() {
System.out.println("这是要发送的数据");
}
}
public class ReversEncrypt implements EncryptComponet{
public ReversEncrypt(EncryptComponet encryptComponet) {
addReservesEncrypt();
}
private void addReservesEncrypt() {
System.out.println("反向加密");
}
@Override
public void encrypt() {
}
}
public class SuperEncrypt implements EncryptComponet{
public SuperEncrypt(EncryptComponet encryptComponet) {
addSuperEncrypt();
}
private void addSuperEncrypt() {
System.out.println("最高加密算法");
}
@Override
public void encrypt() {
}
}
public class TranslateEncrypt implements EncryptComponet{
public TranslateEncrypt(EncryptComponet encryptComponet) {
addTranslateEncrypt();
}
private void addTranslateEncrypt() {
System.out.println("移动加密");
}
@Override
public void encrypt() {
}
}
public class Client {
public static void main(String[] args) {
EncryptComponet s0,s1,s2,s3;
s0 = new RawData();
s1 = new TranslateEncrypt(s0);
s2 = new ReversEncrypt(s1);
s3 = new SuperEncrypt(s2);
s3.encrypt();
}
}
现需要设计一个可以模拟各种动物行为的机器人,在机器人中定义了一系列方法,如机器人叫喊方法cry()、机器人移动方法move()等。如果希望在不修改已有代码的基础上使得机器人能够像狗一样叫,像狗一样跑,使用适配器模式进行系统设计。
1)类图
实现代码
public interface Robot {
public void cry();
public void move();
}
public class Dog {
public void barks(){
System.out.println("狗在叫");
}
public void run(){
System.out.println("狗在跑");
}
}
public class Dogadapter extends Dog implements Robot{
@Override
public void cry() {
barks();
}
@Override
public void move() {
run();
}
}
public class Client {
public static void main(String[] args) {
Dogadapter dogrobot = new Dogadapter();
dogrobot.move();
dogrobot.cry();
}
}
实现结果
8. 在NBA作为外籍中锋,我需要翻译,具体场景描述如下:?
姚明刚来到NBA,身材够高,球技够好;
但是英语不是很懂,听不懂教练的战术安排;
球员分为前锋、中锋和后卫;
教练会给球员分配进攻、防守任务。
现请使用适配器模式模拟这个场景。
类图
实现代码:
public abstract class Player
{
protected String name;
public Player(String name)
{
this.name = name;
}
public abstract void attack();
public abstract void defense();
}
public class Guards extends Player
{
public Guards(String name)
{
super(name);
}
public void attack()
{
System.out.println("后卫" + name + "进攻");
}
public void defense()
{
System.out.println("后卫" + name + "防守");
}
}
public class Center extends Player
{
public Center(String name)
{
super(name);
}
public void attack()
{
System.out.println("中锋" + name + "进攻");
}
public void defense()
{
System.out.println("中锋" + name + "防守");
}
}
public class ForeignCenter
{
private String name;
public void attack()
{
System.out.println("外籍中锋" + name + "进攻");
}
public void defense()
{
System.out.println("外籍中锋" + name + "防守");
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
public class Forwards extends Player
{
public Forwards(String name)
{
super(name);
}
public void attack()
{
System.out.println("前锋" + name + "进攻");
}
public void defense()
{
System.out.println("前锋" + name + "防守");
}
}
public class Translator extends Player
{
private ForeignCenter wjzf = new ForeignCenter();
public Translator(String name)
{
super(name);
wjzf.setName(name);
}
public void attack()
{
wjzf.attack();
}
public void defense()
{
wjzf.defense();
}
}
public class Client {
public static void main(String[] args)
{
Player b = new Forwards("巴蒂尔");
b.attack();
Player m = new Guards("麦克格雷迪");
m.attack();
Player ym = new Translator("姚明");
ym.attack();
ym.defense();
}
}
实现结果:
售后服务方案(赠送)
1.售后服务概述
公司长期以来一直致力于提供高质量、完善的支持服务,确保用户的系统稳定运行。
公司拥有一批资深的施工人员,具有丰富的经验,能够很好的解决设备各类故障,强大的用户支持队伍和良好的用户满意度是我们的一大优势。
维护计划及承诺
?一、 项目售后服务内容承诺
我公司贯彻执行:“诚信正直、成就客户、完善自我、追求卓越”的宗旨,对于已经竣工、验收合格的项目进行质量跟踪服务,本着技术精益求精的精神,向用户奉献一流的技术和一流的维护服务。
我公司如果承接了端拾器项目,将严格遵循标书及合同的规定,在保证期内向业主提供该项目的责任和义务。在保修期之后,考虑到设备维护的连续性,建议业主与我公司签订维护合同,以确保此系统项目的正常运行所必需的技术支持和管理支持。
二、 服务与保证期
?在项目验收合格之日起,开始进行售后服务工作,包括以下几个方面:
1、售后服务期; ?2、维护人员; 3、售后服务项目; 4、服务响应时间。
? 三、 售后服务期
? 在项目验收合格之日起,即进入了售后服务期。
售后服务期=质量保证期+质量维护期
? 质量保证期:在质量保证期内,如因质量问题造成的故障,实行免费更换设备、元器件及材料。如因非质量因素造成的故障,收取更换设备、元器件及材料成本费。
质量维护期:在质量保证期之后,即自行进入质量维护期。
我方对所承担端拾器项目提供终身质量维护服务,以不高于本合同设备单价的优惠价格提供所需更换的元器件及材料,另收维护人员工本费。
四、 具体措施承诺
? 1、首先在签订项目合同的同时与客户签订售后服务保证协议书,排除客户的后顾之忧,对客户做出实事求是的、客观的承诺。
2、对已经验收合格交付用户的端拾器项目,在合同期内与用户进行联系,记录用户使用情况,系统运行状况等进行质量跟踪调查,变被动服务为主动服务。
3、对已交工的端拾器项目建立系统运行档案,并进行质量跟踪。
4、系统运行档案记录其端拾器项目运行情况、各类设备使用情况、操作人员操作水平情况及人员流动情况。
5、针对各用户单位操作人员出现的代表性问题,定期对操作人员进行技术培训或到现场培训及指导。
6、正在使用中的系统、设备出现故障时,公司维修服务人员接到报告后及时赴现场处理、维修。
7、对于运行时间较长的端拾器项目,公司维修服务人员定期与客户进行联系询问情况,定期到客户方进行巡视、检查,并做出记录,记录归档保存。
8、施工保证
将选派具有丰富经验的技术人员负责端拾器项目具体施工,保证安装质量及系统使用功能,并保证整个系统运行平稳、高效、可靠。
9、系统保修
作为项目承包单位,我公司将严格遵循招标文件及合同的规定,向业主提供端拾器项目最终验收合格之日起,在保质期范围内免费维修。
10、保修期内设备损坏,经鉴定为设备本身原因造成的故障,我方负责免费维修或者更换;同时负责在保修期内定期对设备提供保养维护服务。
总之,为使业主使用放心、使用方便、保证端拾器项目正常运行,公司全体技术、维护人员本着客户第一的原则,全心全意地为客户着想,全力以赴的进行工作,让我们共同携手,为创造美好的明天而努力工作。
五、保修服务内容及范围
我公司将为所承担的各个端拾器项目提供保修服务,有效期从项目验收后,业主在竣工报告上签字之日起。
1、 响应时间:具体的响应时间将按故障级别划分;
2、 维修地点:用户现场。
我公司负责实施的所有系统项目,在正常环境下做适当使用时所发生的故障,我公司将提供约定保修服务。非当前故障,我公司安排提供服务,但需按收费标准另收费用。
我公司的保修服务仅限于经我公司认定的合格产品。所谓不合格的产品包括:非经我公司供应的产品、非经我公司认定合格的产品及顾客不允许我公司做功能改进的产品。
下列情况所发生的系统损害不包括在保修服务范围内:
1、 使用不适当的工具进行系统维护时造成的系统设备损坏;
2、 现场环境不符合我公司建议的规范;
3、 意外、自然灾害、疏忽及不当使用、战争、暴动、罢工、雷击或电力故障、顾客搬运不当的损坏,经由非我公司人员或其授权的子承包商对系统进行修改和变动;
4.设备的维护和信息处理方式。
六、 系统维护
1、系统运行管理工作
为了保证系统能够长时间的正常运行,我们将进行完善的系统培训,同时制定各个系统项目操作规程,并配合业主制定操作人员责任界面及合理的交接班制度。
2、系统维护保养
我公司的售后服务人员在维护期内将对贵方的系统项目提供服务,使它们保持良好的运行状态。
? 3、月度保养
? 坚持月度维护保养,保证每个系统项目机械装置保持最佳工作状态。
七、维护及服务支持措施
1、电话支持服务
电话服务热线号码以我方提供给业主的号码为准(包括电话和传真号码)。如有更改,我方至少在自更改之日起3天内以电子邮件、传真、电话的方式通知业主。
2、现场排除故障或技术指导
我方在接到业主的电话支持服务请求后,如果不能通过电话支持服务解决设备或产品发生的技术故障,且经双方商议确认需要进行现场支持的情况下,我方将派专业项目技术人员及时前往现场协助业主排除故障。
3、电话咨询服务
对业主在使用设备或产品过程中产生的非故障类问题,我方提供电话咨询服务。
4、投诉受理服务
我方在公司设有用户投诉电话
相关关键词: 面向对象