面向对象系统分析和设计综合实验报告3.docx
《面向对象系统分析和设计综合实验报告3.docx》由会员分享,可在线阅读,更多相关《面向对象系统分析和设计综合实验报告3.docx(25页珍藏版)》请在冰豆网上搜索。
面向对象系统分析和设计综合实验报告3
实验名称:
实验3设计模型实验1学期:
2017-2018学年第二学期一、实验目的
1.熟练使用面向对象设计原则对系统进行重构;
2.熟练使用面向对象编程语言(JAVA或C++)实现几种常见的创建型设计模式和行为型模式,包括简单工厂模式、工厂方法模式、抽象工厂模式和模板方法,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。
二、实验要求
1.选择合适的面向对象设计原则对系统进行重构,正确无误地绘制重构之后的类图;
2.结合实例,正确无误地绘制简单工厂模式、工厂方法模式、抽象工厂模式和模板方法的模式结构图;
3.实现简单工厂模式、工厂方法模式、抽象工厂模式和模板方法,代码运行正确无误。
三、实验内容
1.在某图形库API中提供了多种矢量图模板,用户可以基于这些矢量图创建不同的显示图形,图形库设计人员设计的初始类图如下所示:
在该图形库中,每个图形类(如Circle、Triangle等)的init()方法用于初始化所创建的图形,setColor()方法用于给图形设置边框颜色,fill()方法用于给图形设置填充颜色,setSize()方法用于设置图形的大小,display()方法用于显示图形。
客户类(Client)在使用该图形库时发现存在如下问题:
由于在创建窗口时每次只需要使用图形库中的一种图形,因此在更换图形时需要修改客户类源代码;
在图形库中增加并使用新的图形时需要修改客户类源代码;
客户类在每次使用图形对象之前需要先创建图形对象,有些图形的创建过程较为复杂,导致客户类代码冗长且难以维护。
现需要根据面向对象设计原则对该系统进行重构,要求如下:
隔离图形的创建和使用,将图形的创建过程封装在专门的类中,客户类在使用图形时无须直接创建图形对象,甚至不需要关心具体图形类类名;
客户类能够方便地更换图形或使用新增图形,无须针对具体图形类编程,符合开闭原则。
绘制重构之后的类图并说明在重构过程中所运用的面向对象设计原则。
1)重构之后的类图
2)重构过程中所使用的面向对象设计原则及简要说明:
开闭原则:
创建新图形只要新加入图形工厂和对应图形类,不修改源代码。
依赖倒转原则:
针对接口编程。
单一职责原则:
每个工厂只生产对应图形。
2.某销售管理系统支持多种支付方式,如现金支付、行用卡支付和代金券支付等,我们可能会像下面这么写,考虑用简单工厂模式对其进行重构。
1)类图
2)实现代码:
publicclassClient{
publicstaticvoidmain(String[]args){
IpayFactoryiFactory=newIpayFactory();
Ipaymethonpaymethon=iFactory.createPaymethon("cash");
if(paymethon!
=null){
paymethon.pay();
}else{
System.out.println("error");
}
}
}
publicclassIpayFactory{
publicIpaymethoncreatePaymethon(Stringpaymethon)
{
if(paymethon.equalsIgnoreCase("cash")){
returnnewCash();
}
elseif(paymethon.equalsIgnoreCase("creditcard")){
returnnewCreditCard();
}
if(paymethon.equalsIgnoreCase("voucher")){
returnnewVoucher();
}
else{
returnnull;
}
}
}
publicinterfaceIpaymethon{
publicvoidpay();
}
publicclassCashimplementsIpaymethon{
publicvoidpay(){
System.out.println("Cashpay");
}
}
publicclassCreditCardimplementsIpaymethon{
publicvoidpay(){
System.out.println("CreditCardpay");
}
}
publicclassVoucherimplementsIpaymethon{
publicvoidpay(){
System.out.println("Voucherpay");
}
}
3)实现结果:
3.使用简单工厂模式设计一个可以创建不同几何形状(Shape),如圆形(Circle)、矩形(Rectangle)和三角形(Triangle)等的绘图工具类,每个几何图形均具有绘制Draw()和擦除Erase()两个方法,要求在绘制不支持的几何图形时,抛出一个UnsupportedShapeException异常,绘制类图并编程模拟实现。
1)
类图
2)实现代码:
publicinterfaceShape{
publicvoiddraw();
publicvoiderase();
}
publicclassCircleimplementsShape{
publicvoiddraw(){
System.out.println("draw Circle");
}
publicvoiderase(){
System.out.println("erase Circle");
}
}
publicclassRectangleimplementsShape{
publicvoiddraw(){
System.out.println("draw Rectangle");
}
publicvoiderase(){
System.out.println("erase Rectangle");
}
}
publicclassTriangleimplementsShape{
publicvoiddraw(){
System.out.println("draw Triangle");
}
publicvoiderase(){
System.out.println("erase Triangle");
}
}
publicclassShapeFactory{
publicstaticShapeproduceShape(Stringshape)throwsUnsupportedShapeException{
if(shape.equals("Circle")){
System.out.println("Circle");
returnnewCircle();
}
elseif(shape.equals("Triangle")){
System.out.println("Triangle");
returnnewTriangle();
}
elseif(shape.equals("Rectangle")){
System.out.println("Rectangle");
returnnewRectangle();
}
else{
thrownewUnsupportedShapeException();
}
}
}
publicclassUnsupportedShapeExceptionextendsException{
publicUnsupportedShapeException()
{
System.out.println("绘制图形异常,请确认输入图形。
");
}
}
publicclassClient{
publicstaticvoidmain(String[]args){
ShapeFactoryshapeFactory=newShapeFactory();
try{
shapeFactory.produceShape("Circle").draw();
shapeFactory.produceShape("Circle").erase();
}catch(UnsupportedShapeExceptione){
e.printStackTrace();
}
}
}
3)实现结果:
4.现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReader),如GIF图片读取器(GifReader)用于读取GIF格式的图片、JPG图片读取器(JpgReader)用于读取JPG格式的图片。
图片读取器对象通过图片读取器工厂ImageReaderFactory来创建,ImageReaderFactory是一个抽象类,用于定义创建图片读取器的工厂方法,其子类GifReaderFactory和JpgReaderFactory用于创建具体的图片读取器对象。
试使用工厂方法模式设计该程序,绘制类图并编程模拟实现。
需充分考虑系统的灵活性和可扩展性。
1)类图
2)实现代码:
publicclassClient{
publicstaticvoidmain(String[]args){
JpgReaderFactoryjFactory=newJpgReaderFactory();
jFactory.produceImageReader().readimage();
GifReaderFactorygFactory=newGifReaderFactory();
gFactory.produceImageReader().readimage();
}
}
publicinterfaceImageReader{
publicvoidreadimage();
}
publicclassGifReaderimplementsImageReader{
publicvoidreadimage(){
System.out.println("Readgifimage.");
}
}
publicclassJpgReaderimplementsImageReader{
publicvoidreadimage(){
System.out.println("jpgreader");
System.out.println("Readjpgimage.");
}
}
publicabstractclassImageReaderFactory{
publicabstractImageReaderproduceImageReader();
}
publicclassGifReaderFactoryextendsImageReaderFactory{
publicImageReaderproduceImageReader(){
System.out.println("gifreader");
returnnewGifReader();
}
}
publicclassJpgReaderFactoryextendsImageReaderFactory{
publicImageReaderproduceImageReader(){
returnnewJpgReader();
}
}
3)实现结果:
5.有一个OEM制造商代理做HP笔记本电脑(Laptop),后来该制造商得到了更多的品牌笔记本电脑的订单Acer,Lenovo,Dell,该OEM商发现,如果一次同时做很多个牌子的本本,有些不利于管理。
利用工厂模式改善设计,绘制类图并编程模拟实现。
1)类图
2)实现代码:
publicclassClient{
publicstaticvoidmain(String[]args){
IFactorylf=newHpFactory();
Laptoptp=lf.createLaptop();
tp.show();
lf=newAcerFactory();
tp=lf.createLaptop();
tp.show();
lf=newLenovoFactory();
tp=lf.createLaptop();
tp.show();
lf=newDellFactory();
tp=lf.createLaptop();
tp.show();
}
}
publicinterfaceIFactory{
publicLaptopcreateLaptop();
}
publicclassAcerFactoryimplementsIFactory{
publicLaptopcreateLaptop(){
returnnewAcerLaptop();
}
}
publicclassDellFactoryimplementsIFactory{
publicLaptopcreateLaptop(){
returnnewDellLaptop();
}
}
publicclassHpFactoryimplementsIFactory{
publicLaptopcreateLaptop(){
returnnewHpLaptop();
}
}
publicclassLenovoFactoryimplementsIFactory{
publicLaptopcreateLaptop(){
returnnewLenovoLaptop();
}
}
publicabstractclassLaptop{
publicvoidshow(){};
}
publicclassAcerLaptopextendsLaptop{
publicvoidshow(){
System.out.println("AcerLaptop");
}
}
publicclassDellLaptopextendsLaptop{
publicvoidshow(){
System.out.println("DellLaptop");
}
}
publicclassHpLaptopextendsLaptop{
publicvoidshow(){
System.out.println("HpLaptop");
}
}
publicclassLenovoLaptopextendsLaptop{
publicvoidshow(){
System.out.println("LenovoLaptop");
}
}
3)实现结果:
6.某软件公司欲开发一套界面皮肤库,可以对桌面软件进行界面美化。
不同的皮肤将提供视觉效果不同的按钮、文本框、组合框等界面元素,其结构如下图所示:
该皮肤库需要具备良好的灵活性和可扩展性,用户可以自由选择不同的皮肤,开发人员可以在不修改既有代码的基础上增加新的皮肤。
试使用抽象工厂模式设计该皮肤库,绘制类图并编程模拟实现。
1)类图
2)实现代码:
publicclassClient{
publicstaticvoidmain(String[]args){
SpringSkinFactoryskinFactory=newSpringSkinFactory();
skinFactory.createButton().action();
skinFactory.createTextbox().action();
skinFactory.createCombobox().action();
}
}
publicinterfaceSkinFactory{
publicAbstractButtoncreateButton();
publicAbstractTextboxcreateTextbox();
publicAbstractComboboxcreateCombobox();
}
publicclassSpringSkinFactoryimplementsSkinFactory{
publicAbstractButtoncreateButton(){
System.out.println("生成greenbutton");
returnnewGreenButton();
}
publicAbstractTextboxcreateTextbox(){
System.out.println("生成greentextbox");
returnnewGreenTextbox();
}
publicAbstractComboboxcreateCombobox(){
System.out.println("生成greencombobox");
returnnewGreenCombobox();
}
}
publicclassSummerSkinFactoryimplementsSkinFactory{
publicAbstractButtoncreateButton(){
System.out.println("生成bluebutton");
returnnewBlueButton();
}
publicAbstractTextboxcreateTextbox(){
System.out.println("生成bluetextbox");
returnnewBlueTextbox();
}
publicAbstractComboboxcreateCombobox(){
System.out.println("生成bluecombobox");
returnnewBlueCombobox();
}
}
publicinterfaceAbstractButton{
publicvoidaction();
}
publicclassGreenButtonimplementsAbstractButton{
@Override
publicvoidaction(){
System.out.println("Greenbutton");
}
}
publicclassBlueButtonimplementsAbstractButton{
@Override
publicvoidaction(){
System.out.println("Bluebutton");
}
}
publicinterfaceAbstractTextbox{
publicvoidaction();
}
publicclassGreenTextboximplementsAbstractTextbox{
@Override
publicvoidaction(){
System.out.println("GreenTextbox");
}
}
publicclassBlueTextboximplementsAbstractTextbox{
@Override
publicvoidaction(){
System.out.println("BlueTextbox");
}
}
publicinterfaceAbstractCombobox{
publicvoidaction();
}
publicclassGreenComboboximplementsAbstractCombobox{
publicvoidaction(){
System.out.println("GreenCombobox");
}
}
publicclassBlueComboboximplementsAbstractCombobox{
publicvoidaction(){
System.out.println("BluCombobox");
}
}
3)实现结果:
7.麦当劳(McDonalds)和肯德基(KFC)快餐店都经营汉堡(Hamburg)和可乐(Cola),用控制台应用程序实现这两个快餐店经营产品的抽象工厂模式,并绘制该模式的UML图。
1)类图
2)实现代码:
publicclassClient{
publicstaticvoidmain(String[]args){
Hamburgh;
Colac;
AbstractFactoryaf=newMDNFactory();
h=af.createHamburg();
c=af.createCola();
h.getHumburg();
c.getCola();
af=newKDJFactory();
h=af.createHamburg();
c=af.createCola();
h.getHumburg();
c.getCola();
}
}
publicinterfaceAbstractFactory{
publicHamburgcreateHamburg();
publicColacreateCola();
}
publicclassKDJFactoryimplementsAbstractFactory{
@Override
publicHamburgcreateHamburg(){
returnnewKDJHamburg();
}
@Override
publicColacreateCola(){
returnnewKDJCola();
}
}
publ