西南科技大学计算机学院 《面向对象系统分析和设计》实验报告 实验名称:实验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