• 小学
  • 初中
  • 高中
  • 小升初
  • 中考
  • 高考
  • 英语
  • 考研
  • 四六级
  • 单元
  • 节日
  • 母爱
  • 诚信
  • 父爱
  • 环保
  • 家庭
  • 感动
  • 成长
  • 感恩
  • 梦想
  • 爱国
  • 写景
  • 写人
  • 叙事
  • 状物
  • 议论
  • 说明
  • 抒情
  • 观后感
  • 诗歌
  • 读后感
  • 想象
  • 素材
  • 名言
  • 段落
  • 哲理
  • 诗词
  • 成语
  • 赏析
  • 基础
  • 演练
  • 教学
  • 当前位置: 天一资源网 > 面向对象 正文

    [面向对象系统分析和设计综合实验报告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、投诉受理服务

      我方在公司设有用户投诉电话

    相关关键词: 面向对象
    相关热词搜索: 面向对象 系统分析 实验 报告 综合

    • 范文大全
    • 教案下载
    • 优秀作文
    • 励志
    • 课件
    • 散文
    • 名人名言