面向对象系统分析和设计综合实验报告4 下载本文

西南科技大学计算机学院 《面向对象系统分析和设计》实验报告 实验名称:实验4 设计模型实验2 学期:2017-2018学年 第二学期 一、实验目的

1.熟练使用面向对象设计原则对系统进行重构;

2.熟练使用面向对象编程语言(JAVA或C++)实现几种常见的设计模式,包括单例模式、策略模式、装饰模式和适配器模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。

二、实验要求

1. 选择合适的面向对象设计原则对系统进行重构,正确无误地绘制重构之后的类图; 2. 结合实例,正确无误地绘制单例模式、策略模式、装饰模式和适配器模式的结构图; 3. 实现单例模式、策略模式、装饰模式和适配器模式,代码运行正确无误。 三、实验内容

1. 现实生活中,居民身份证号码具有唯一性,同一个人不允许有多个身份证号码,第一次申请身份证时将号码分配给居民,如果之后因为遗失等原因补办时,还是使用原来的身份证号码,不会产生新号码,现使用单例模式模拟该场景。

1) 类图

2) 实现代码:

public class IdClient {

1

西南科技大学计算机学院 《面向对象系统分析和设计》实验报告

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(\);

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. 每一麻将局都有两个骰子,因此骰子就应当是双例类。现使用多例模式模拟该场景。

2

西南科技大学计算机学院 《面向对象系统分析和设计》实验报告

1) 类图

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 {

3

西南科技大学计算机学院 《面向对象系统分析和设计》实验报告 }

private static Dice die1, die2;

public static void main(String[] args) { die1 = Dice.getInstance(1); die2 = Dice.getInstance(2);

System.out.println(\第一骰子骰出: \ System.out.println(\第二骰子骰出: \}

3. 某软件公司为某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供不同的电影票(MovieTicket)打折(Discount)方式,具体打折方案如下:

? 学生凭学生证可享受票价8折优惠;

? 年龄在10周岁及以下的儿童可享受每张票减免10元的优惠(原始票价需大于等于

20元);

? 影院VIP用户除享受票价半价优惠外还可进行积分,积分累计到一定额度可换取电

影院赠送的奖品。

该系统在将来可能还要根据需要引入新的打折方式。 试使用策略模式设计并编程模拟实现该影院售票系统。 1) 类图

2) 实现代码:

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; }

4