一、实验目的
1.熟练使用面向对象设计原则对系统进行重构;
2.熟练使用面向对象编程语言(JAVA或C++)实现几种常见的创建型设计模式和行为型模式,包括简单工厂模式、工厂方法模式、抽象工厂模式和模板方法,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。
二、实验要求
1. 选择合适的面向对象设计原则对系统进行重构,正确无误地绘制重构之后的类图; 2. 结合实例,正确无误地绘制简单工厂模式、工厂方法模式、抽象工厂模式和模板方法的模式结构图;
3. 实现简单工厂模式、工厂方法模式、抽象工厂模式和模板方法,代码运行正确无误。
三、实验内容
1.在某图形库API中提供了多种矢量图模板,用户可以基于这些矢量图创建不同的显示图形,图形库设计人员设计的初始类图如下所示:
ClientCircle+++++TriangleRectangleinit (): void+init (): void+init (): voidsetColor (): void+setColor (): void+setColor (): voidfill (): void+fill (): void+fill (): voidsetSize (): void+setSize (): void+setSize (): voiddisplay (): void+display (): void+display (): void .........在该图形库中,每个图形类(如Circle、Triangle等)的init()方法用于初始化所创建的
图形, setColor()方法用于给图形设置边框颜色,fill()方法用于给图形设置填充颜色,setSize()方法用于设置图形的大小,display()方法用于显示图形。
客户类(Client)在使用该图形库时发现存在如下问题:
① 由于在创建窗口时每次只需要使用图形库中的一种图形,因此在更换图形时需要修改客户类源代码;
② 在图形库中增加并使用新的图形时需要修改客户类源代码;
③ 客户类在每次使用图形对象之前需要先创建图形对象,有些图形的创建过程较为复杂,导致客户类代码冗长且难以维护。
1
西南科技大学计算机学院 《面向对象系统分析和设计》实验报告
现需要根据面向对象设计原则对该系统进行重构,要求如下:
① 隔离图形的创建和使用,将图形的创建过程封装在专门的类中,客户类在使用图形时无须直接创建图形对象,甚至不需要关心具体图形类类名;
② 客户类能够方便地更换图形或使用新增图形,无须针对具体图形类编程,符合开闭原则。
绘制重构之后的类图并说明在重构过程中所运用的面向对象设计原则。 1) 重构之后的类图
2) 重构过程中所使用的面向对象设计原则及简要说明:
开闭原则:创建新图形只要新加入图形工厂和对应图形类,不修改源代码。 依赖倒转原则:针对接口编程。
单一职责原则:每个工厂只生产对应图形。
2. 某销售管理系统支持多种支付方式,如现金支付、行用卡支付和代金券支付等,我们可能会像下面这么写,考虑用简单工厂模式对其进行重构。
2
西南科技大学计算机学院 《面向对象系统分析和设计》实验报告
1) 类图
2) 实现代码:
public class Client {
public static void main(String[] args) {
IpayFactory iFactory = new IpayFactory();
Ipaymethon paymethon = iFactory.createPaymethon(\"cash\"); if (paymethon != null) { paymethon.pay(); } else {
System.out.println(\"error\"); } }
}
public class IpayFactory {
public Ipaymethon createPaymethon(String paymethon) {
3
西南科技大学计算机学院 《面向对象系统分析和设计》实验报告 }
if (paymethon.equalsIgnoreCase(\"cash\")) { return new Cash(); }
else if (paymethon.equalsIgnoreCase(\"creditcard\")) { return new CreditCard(); }
if (paymethon.equalsIgnoreCase(\"voucher\")) { return new Voucher(); }
else {
return null; }
}
public interface Ipaymethon { public void pay();
}
public class Cash implements Ipaymethon { public void pay(){
System.out.println(\"Cash pay\"); }
}
public class CreditCard implements Ipaymethon { public void pay(){
System.out.println(\"CreditCard pay\"); }
}
public class Voucher implements Ipaymethon { public void pay(){
System.out.println(\"Voucher pay\"); }
}
3) 实现结果:
3.使用简单工厂模式设计一个可以创建不同几何形状(Shape),如圆形(Circle)、矩形(Rectangle)和三角形(Triangle)等的绘图工具类,每个几何图形均具有绘制Draw()和擦除Erase()两个方法,要求在绘制不支持的几何图形时,抛出一个UnsupportedShapeException异常,
4
西南科技大学计算机学院 《面向对象系统分析和设计》实验报告 绘制类图并编程模拟实现。
1) 类图
2) 实现代码:
public interface Shape { public void draw(); public void erase(); }
public class Circle implements Shape { public void draw(){
System.out.println(\"draw Circle\"); }
public void erase(){
System.out.println(\"erase Circle\"); }
}
public class Rectangle implements Shape { public void draw(){
System.out.println(\"draw Rectangle\"); }
public void erase(){
System.out.println(\"erase Rectangle\"); }
}
public class Triangle implements Shape {
5
西南科技大学计算机学院 《面向对象系统分析和设计》实验报告 public void draw(){
System.out.println(\"draw Triangle\"); }
public void erase(){
System.out.println(\"erase Triangle\"); }
}
public class ShapeFactory {
public static Shape produceShape(String shape) throws UnsupportedShapeException {
if (shape.equals(\"Circle\")) { System.out.println(\"Circle\"); return new Circle(); }
else if (shape.equals(\"Triangle\")) { System.out.println(\"Triangle\"); return new Triangle(); }
else if (shape.equals(\"Rectangle\")) { System.out.println(\"Rectangle\"); return new Rectangle(); }
else {
throw new UnsupportedShapeException(); } }
}
public class UnsupportedShapeException extends Exception{ public UnsupportedShapeException () {
System.out.println(\"绘制图形异常,请确认输入图形。\"); }
}
public class Client {
public static void main(String[] args) {
ShapeFactory shapeFactory=new ShapeFactory(); try {
shapeFactory.produceShape(\"Circle\").draw(); shapeFactory.produceShape(\"Circle\").erase(); } catch (UnsupportedShapeException e) { e.printStackTrace(); } }
}
6
西南科技大学计算机学院 《面向对象系统分析和设计》实验报告
3) 实现结果:
4. 现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReader),如GIF图片读取器(GifReader)用于读取GIF格式的图片、JPG图片读取器(JpgReader)用于读取JPG格式的图片。图片读取器对象通过图片读取器工厂ImageReaderFactory来创建,ImageReaderFactory是一个抽象类,用于定义创建图片读取器的工厂方法,其子类GifReaderFactory和JpgReaderFactory用于创建具体的图片读取器对象。试使用工厂方法模式设计该程序,绘制类图并编程模拟实现。需充分考虑系统的灵活性和可扩展性。
1) 类图
2) 实现代码:
public class Client {
public static void main(String[] args) {
JpgReaderFactory jFactory = new JpgReaderFactory(); jFactory.produceImageReader().readimage();
GifReaderFactory gFactory = new GifReaderFactory(); gFactory.produceImageReader().readimage(); }
}
public interface ImageReader {
7
西南科技大学计算机学院 《面向对象系统分析和设计》实验报告 public void readimage();
}
public class GifReader implements ImageReader { public void readimage(){
System.out.println(\"Read gif image.\"); }
}
public class JpgReader implements ImageReader { public void readimage(){
System.out.println(\"jpg reader\");
System.out.println(\"Read jpg image.\"); }
}
public abstract class ImageReaderFactory {
public abstract ImageReader produceImageReader(); }
public class GifReaderFactory extends ImageReaderFactory { public ImageReader produceImageReader(){ System.out.println(\"gif reader\"); return new GifReader(); }
}
public class JpgReaderFactory extends ImageReaderFactory { public ImageReader produceImageReader(){ return new JpgReader(); }
}
3) 实现结果:
5. 有一个OEM制造商代理做HP笔记本电脑(Laptop),后来该制造商得到了更多的品牌笔记本电脑的订单Acer,Lenovo,Dell,该OEM商发现,如果一次同时做很多个牌子的本本,有些不利于管理。利用工厂模式改善设计,绘制类图并编程模拟实现。
1) 类图
8
西南科技大学计算机学院 《面向对象系统分析和设计》实验报告
2) 实现代码:
public class Client {
public static void main(String[] args){ IFactory lf = new HpFactory(); Laptop tp = lf.createLaptop(); tp.show();
lf = new AcerFactory(); tp = lf.createLaptop(); tp.show();
lf = new LenovoFactory(); tp = lf.createLaptop(); tp.show();
lf = new DellFactory(); tp = lf.createLaptop(); tp.show(); }
}
public interface IFactory {
public Laptop createLaptop(); }
public class AcerFactory implements IFactory { public Laptop createLaptop(){ return new AcerLaptop(); } }
public class DellFactory implements IFactory {
9
西南科技大学计算机学院 《面向对象系统分析和设计》实验报告 public Laptop createLaptop(){ return new DellLaptop(); } }
public class HpFactory implements IFactory { public Laptop createLaptop(){ return new HpLaptop(); } }
public class LenovoFactory implements IFactory { public Laptop createLaptop(){ return new LenovoLaptop(); } }
public abstract class Laptop { public void show(){}; }
public class AcerLaptop extends Laptop { public void show(){
System.out.println(\"AcerLaptop\"); } }
public class DellLaptop extends Laptop { public void show(){
System.out.println(\"DellLaptop\"); } }
public class HpLaptop extends Laptop { public void show(){
System.out.println(\"HpLaptop\"); } }
public class LenovoLaptop extends Laptop { public void show(){
System.out.println(\"LenovoLaptop\");
10
西南科技大学计算机学院 《面向对象系统分析和设计》实验报告 } }
3) 实现结果:
6. 某软件公司欲开发一套界面皮肤库,可以对桌面软件进行界面美化。不同的皮肤将提供视觉效果不同的按钮、文本框、组合框等界面元素,其结构如下图所示:
浅绿色按钮Spring风格绿色边框文本框绿色边框组合框皮肤库浅蓝色按钮Summer风格蓝色边框文本框蓝色边框组合框 该皮肤库需要具备良好的灵活性和可扩展性,用户可以自由选择不同的皮肤,开发人员可以在不修改既有代码的基础上增加新的皮肤。试使用抽象工厂模式设计该皮肤库,绘制类图并编程模拟实现。
1) 类图
11
西南科技大学计算机学院 《面向对象系统分析和设计》实验报告
2) 实现代码:
public class Client {
public static void main(String[] args) {
SpringSkinFactory skinFactory = new SpringSkinFactory(); skinFactory.createButton().action(); skinFactory.createTextbox().action(); skinFactory.createCombobox().action(); }
}
public interface SkinFactory {
public AbstractButton createButton(); public AbstractTextbox createTextbox(); public AbstractCombobox createCombobox();
}
public class SpringSkinFactory implements SkinFactory { public AbstractButton createButton(){ System.out.println(\"生成 green button\"); return new GreenButton(); }
public AbstractTextbox createTextbox(){ System.out.println(\"生成 green textbox\"); return new GreenTextbox(); }
public AbstractCombobox createCombobox(){ System.out.println(\"生成 green combobox\"); return new GreenCombobox(); }
}
public class SummerSkinFactory implements SkinFactory { public AbstractButton createButton(){
System.out.println(\"生成 blue button\"); return new BlueButton();
12
西南科技大学计算机学院 《面向对象系统分析和设计》实验报告
}
public AbstractTextbox createTextbox(){ System.out.println(\"生成 blue textbox\"); return new BlueTextbox(); }
public AbstractCombobox createCombobox(){ System.out.println(\"生成 blue combobox\"); return new BlueCombobox(); }
}
public interface AbstractButton { public void action();
}
public class GreenButton implements AbstractButton { @Override
public void action() {
System.out.println(\"Green button\"); }
}
public class BlueButton implements AbstractButton { @Override
public void action() {
System.out.println(\"Blue button\"); }
}
public interface AbstractTextbox { public void action();
}
public class GreenTextbox implements AbstractTextbox { @Override
public void action() {
System.out.println(\"Green Textbox\"); }
}
public class BlueTextbox implements AbstractTextbox { @Override
public void action() {
System.out.println(\"Blue Textbox\"); }
}
public interface AbstractCombobox { public void action();
}
13
西南科技大学计算机学院 《面向对象系统分析和设计》实验报告 public class GreenCombobox implements AbstractCombobox { public void action() {
System.out.println(\"Green Combobox\"); }
}
public class BlueCombobox implements AbstractCombobox { public void action() {
System.out.println(\"Blu Combobox\"); }
}
3) 实现结果:
7. 麦当劳(McDonalds)和肯德基(KFC)快餐店都经营汉堡(Hamburg)和可乐(Cola),用控制台应用程序实现这两个快餐店经营产品的抽象工厂模式,并绘制该模式的UML图。
1) 类图
14
西南科技大学计算机学院 《面向对象系统分析和设计》实验报告
2) 实现代码:
public class Client {
public static void main(String[] args) { Hamburg h; Cola c;
AbstractFactory af = new MDNFactory(); h = af.createHamburg(); c = af.createCola(); h.getHumburg(); c.getCola();
af = new KDJFactory(); h = af.createHamburg(); c = af.createCola(); h.getHumburg(); c.getCola(); }
}
public interface AbstractFactory { public Hamburg createHamburg(); public Cola createCola(); }
public class KDJFactory implements AbstractFactory { @Override
public Hamburg createHamburg() {
15
西南科技大学计算机学院 《面向对象系统分析和设计》实验报告 }
public class MDNFactory implements AbstractFactory { @Override
public Hamburg createHamburg() { return new MDNHamburg(); }
@Override
public Cola createCola() { return new MDNCola(); } }
public interface Cola { public void getCola(); }
public class KDJCola implements Cola { @Override
public void getCola() {
System.out.println(\"KDJCola\"); } }
public class MDNCola implements Cola { @Override
public void getCola() {
System.out.println(\"MDNCola\"); } }
public interface Hamburg { public void getHumburg(); }
public class KDJHamburg implements Hamburg {
return new KDJHamburg(); }
@Override
public Cola createCola() { return new KDJCola(); }
16
西南科技大学计算机学院 《面向对象系统分析和设计》实验报告 }
public class MDNHamburg implements Hamburg { @Override
public void getHumburg() {
System.out.println(\"MDNHamburg\"); } }
3) 实现结果:
8. 某软件公司要为某银行的业务支撑系统开发一个利息计算模块,利息的计算流程如@Override
public void getHumburg() {
System.out.println(\"KDJHamburg\"); }
17
西南科技大学计算机学院 《面向对象系统分析和设计》实验报告 下:
(1) 系统根据账号和密码验证用户信息,如果用户信息错误,则系统显示出错提示。 (2) 如果用户信息正确,则根据用户类型的不同使用不同的利息计算公式计算利息(如活期账户和定期账户具有不同的利息计算公式)。
(3) 系统显示利息。
现使用模板方法模式设计该利息计算模块。 1) 类图
2) 实现代码:
public class Client {
public static void main(String[] args) throws Exception { Account acc = new CurrentAccount(); acc.Handle(\"敖海洋\", \"5120152558\"); } }
public abstract class Account {
// 基本方法——具体方法
public boolean validate(String account, String password) { }
System.out.println(String.format(\"账号:'%s'\", account)); System.out.println(String.format(\"密码:'%s'\", password)); // 模拟登录
if (account.equals(\"敖海洋\") && password.equals(\"5120152558\")) { return true; } else {
return false; }
// 基本方法——抽象方法
public abstract void calculateInterest(); // 基本方法——具体方法
18
西南科技大学计算机学院 《面向对象系统分析和设计》实验报告
public void display() {
System.out.println(\"显示利息!\"); }
// 模板方法
public void Handle(String account, String password) { if (!validate(account, password)) {
System.out.println(\"账户或密码错误!\"); return; }
calculateInterest(); display(); } }
class CurrentAccount extends Account { @Override
public void calculateInterest() {
System.out.println(\"按活期利率计算利息!\"); } }
class SavingAccount extends Account { @Override
public void calculateInterest() { }
System.out.println(\"按定期利率计算利息!\"); }
3) 实现结果:
19
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务