软件设计模式实验报告.docx
《软件设计模式实验报告.docx》由会员分享,可在线阅读,更多相关《软件设计模式实验报告.docx(36页珍藏版)》请在冰豆网上搜索。
软件设计模式实验报告
计算机科学与技术学院
实验报告
课程名称:
软件设计模式
专业:
计算机科学与技术
班级:
2011级1班
学号:
201113137040
姓名:
刘进平
实验一单例模式的应用
1实验目的
1)掌握单例模式(Singleton)的特点
2)分析具体问题,使用单例模式进行设计。
2实验内容和要求
很多应用项目都有配置文件,这些配置文件里面定义一些应用需要的参数数据。
通常客户端使用这个类是通过new一个AppConfig的实例来得到一个操作配置文件内容的对象。
如果在系统运行中,有很多地方都需要使用配置文件的内容,系统中会同时存在多份配置文件的内容,这会严重浪费内存资源。
事实上,对于AppConfig类,在运行期间,只需要一个对象实例就够了。
那么应该怎么实现呢?
用C#控制台应用程序实现该单例模式。
绘制该模式的UML图。
UML图:
源代码:
classProgram
{
staticvoidMain(string[]args)
{
AppConfigappConfigOne=AppConfig.GetParameterA();
AppConfigappConfigTwo=AppConfig.GetParameterA();
if(appConfigOne.Equals(appConfigTwo))
{
Console.WriteLine("appConfigOne和appConfigTwo代表的是同一个实例!
");
}
else
{
Console.WriteLine("appConfigOne和appConfigTwo代表的是不同的实例!
");
}
Console.ReadKey();
}
}
}
运行结果:
实验小结:
通过这次实验,我了解了单例模式的具体概念和使用方法,并且感受到了他的优点带来的方便,但是同时也知道了该设计模式的缺点:
由于单例模式中没有抽象层,因此单例类的扩展有很大困难。
实验二工厂模式的应用
1实验目的
1)掌握工厂模式(Factory)的特点
2)分析具体问题,使用工厂模式进行设计。
2实验内容和要求
有一个OEM制造商代理做HP笔记本电脑(Laptop),后来该制造商得到了更多的品牌笔记本电脑的订单Acer,Lenovo,Dell,该OEM商发现,如果一次同时做很多个牌子的本本,有些不利于管理。
利用工厂模式改善设计,用C#控制台应用程序实现该OEM制造商的工厂模式。
绘制该模式的UML图。
UML图:
源代码:
classLaptop
{
publicvirtualvoidGetLaptop(){}
}
classHpLaptop:
Laptop
{
publicoverridevoidGetLaptop()
{
Console.WriteLine("生产了一台Hp电脑");
}
}
classAcerLaptop:
Laptop
{
publicoverridevoidGetLaptop()
{
Console.WriteLine("生产了一台Acer电脑");
}
}
classLenovoLaptop:
Laptop
{
publicoverridevoidGetLaptop()
{
Console.WriteLine("生产了一台Lenovo电脑");
}
}
classDellLaptop:
Laptop
{
publicoverridevoidGetLaptop()
{
Console.WriteLine("生产了一台Dell电脑");
}
}
interfaceIFactory
{
LaptopCreateFactory();
}
classHpFactory:
IFactory
{
publicLaptopCreateFactory()
{
returnnewHpLaptop();
}
}
classAcerFactory:
IFactory
{
publicLaptopCreateFactory()
{
returnnewAcerLaptop();
}
}
classLenovoFactory:
IFactory
{
publicLaptopCreateFactory()
{
returnnewLenovoLaptop();
}
}
classDellFactory:
IFactory
{
publicLaptopCreateFactory()
{
returnnewDellLaptop();
}
}
classProgram
{
staticvoidMain(string[]args)
{
IFactorylaptopFactory=newLenovoFactory();
IFactorylaptopFactory1=newHpFactory();
IFactorylaptopFactory2=newAcerFactory();
IFactorylaptopFactory3=newDellFactory();
Laptoplaptop=laptopFactory.CreateFactory();
Laptoplaptop1=laptopFactory1.CreateFactory();
Laptoplaptop2=laptopFactory2.CreateFactory();
Laptoplaptop3=laptopFactory3.CreateFactory();
laptop.GetLaptop();
laptop1.GetLaptop();
laptop2.GetLaptop();
laptop3.GetLaptop();
Console.ReadKey();
}
}
}
运行结果:
实验小结:
通过本次实验,我了解了工厂模式的适用范围和他的一些特点,工厂模式在一定程度上解决某些代码违反了面向对象设计的开放封闭原则。
同时还了解了它的一些优点和弊端,比如:
使用工厂方法模式的另一个优点是在系统中加入新产品时,无需修改抽象工厂和抽象产品提供的接口,无需修改客户端,也无需修改其它的具体工厂和具体产品,而只要添加一个新的具体工厂和具体产品即可。
实验三抽象工厂模式的应用
1实验目的
1)掌握抽象工厂模式(AbstractFactory)的特点
2)分析具体问题,使用抽象工厂模式进行设计。
2实验内容和要求
麦当劳(McDonalds)和肯德基(KFC)快餐店都经营汉堡(Hamburg)和可乐(Cola),用C#控制台应用程序实现这两个快餐店经营产品的抽象工厂模式。
绘制该模式的UML图。
UML图:
源代码:
interfaceIHamburg
{
voidHamburgName();
}
classMcDonaldsHamburg:
IHamburg
{
publicvoidHamburgName()
{
Console.WriteLine("这是McDonaldsHamburg");
}
}
classKFCHamburg:
IHamburg
{
publicvoidHamburgName()
{
Console.WriteLine("这是KFCHamburg");
}
}
interfaceICola
{
voidColaName();
}
classMcDonaldsCola:
ICola
{
publicvoidColaName()
{
Console.WriteLine("这是McDonaldsCola");
}
}
classKFCCola:
ICola
{
publicvoidColaName()
{
Console.WriteLine("这是KFCCola");
}
}
interfaceIFactory
{
IHamburgCreateHamburg();
IColaCreateCola();
}
classMcDonaldsFactory:
IFactory
{
publicIHamburgCreateHamburg()
{
returnnewMcDonaldsHamburg();
}
publicIColaCreateCola()
{
returnnewMcDonaldsCola();
}
}
classKFCFactory:
IFactory
{
publicIHamburgCreateHamburg()
{
returnnewKFCHamburg();
}
publicIColaCreateCola()
{
returnnewKFCCola();
}
}
classProgram
{
staticvoidMain(string[]args)
{
IFactoryfactory=newKFCFactory();
IFactoryfactory1=newMcDonaldsFactory();
IHamburghamburg1=factory1.CreateHamburg();
IColacola1=factory1.CreateCola();
IHamburghamburg=factory.CreateHamburg();
IColacola=factory.CreateCola();
hamburg.HamburgName();
cola.ColaName();
hamburg1.HamburgName();
cola1.ColaName();
Console.ReadKey();
}
}
}
运行结果:
实验小结:
通过本次实验,加深了对抽象工厂模式的理解。
抽象工厂提供一个创建一系列相关或相互依赖对象的接口,而不需指定他们具体的类。
抽象工厂同样是存在缺点的,难以支持新种类的产品。
由于以前对C++不太了解,本次实验加深了对C++的了解,强化了编程能力。
理解解了构造函数,虚函数,纯虚函数,成员函数实现,类之间的继承等含义。
但对于函数的调用问题常常出错,这在以后的学习中应多加注意和练习。
实验四建造者模式的应用
1实验目的
1)掌握建造者模式(Builder)的特点
2)分析具体问题,使用建造者模式进行设计。
2实验内容和要求
建造者模式是一种创建型模式,它主要是应对项目中一些复杂对象的创建工作。
所谓“复杂对象”,是指此对象中还含有其它的子对象。
我们现在定义一个场景:
汽车生产必须包含车轮(Wheel)、油箱(OilBox)和车身(Body),应用建造者模式,用C#控制台应用程序实现该设计,构建BMW品牌和BenZ品牌汽车生产。
绘制该模式的UML图。
UML图:
源代码:
publicabstractclassICar
{
publicabstractvoidWheel();
publicabstractvoidOilBox();
publicabstractvoidBody();
}
classBenz:
ICar
{
publicoverridevoidWheel()
{
Console.Write("奔驰的轮子,");
}
publicoverridevoidOilBox()
{
Console.Write("奔驰的油箱,");
}
publicoverridevoidBody()
{
Console.WriteLine("奔驰的车体!
");
}
}
classBMW:
ICar
{
publicoverridevoidWheel()
{
Console.Write("宝马的轮子,");
}
publicoverridevoidOilBox()
{
Console.Write("宝马的油箱,");
}
publicoverridevoidBody()
{
Console.WriteLine("宝马的车体!
");
}
}
classDriver
{
publicvoidinclude(ICarcar)
{
car.Wheel();
car.OilBox();
car.Body();
}
}
classProgram
{
staticvoidMain(string[]args)
{
ICarcar=newBenz();
ICarcar1=newBMW();
Driverzhangsan=newDriver();
zhangsan.include(car);
Driverlisi=newDriver();
lisi.include(car1);
Console.ReadKey();
}
}
}
运行结果:
实验小结:
建造者模式的设计目的是消除其他对象的复杂创建过程。
使用建造者模式不仅是最佳的做法,而且在某个对象的构建和配制方法改变时可以尽量减少重复更改代码
实验五适配器模式的应用
1实验目的
1)掌握适配器模式(Adapter)的特点
2)分析具体问题,使用适配器模式进行设计。
2实验内容和要求
一个软件团队开发绘图系统,设计了圆对象(Circle)、矩形对象(Rectangle),线对象(Line)都支持Draw()函数,即可以通过Draw()函数绘制图形。
为了加快项目进度,将角度对象(Angle)绘制功能交给了合作团队实现。
但合作团队将角度对象绘制函数定为了DrawAngle()。
绘图系统提供给用户后,用户不满意,希望能统一的调用,不用记太多命令。
应用适配器模式,用C#控制台应用程序完善该设计。
绘制该模式的UML图。
UML图:
源代码:
abstractclassIDrawing
{
publicabstractvoidDraw();
}
classCircle:
IDrawing
{
publicoverridevoidDraw()
{
Console.WriteLine("这是Circle里面的Draw方法");
}
}
classRectangle:
IDrawing
{
publicoverridevoidDraw()
{
Console.WriteLine("这是Rectangle里面的Draw方法");
}
}
classLine:
IDrawing
{
publicoverridevoidDraw()
{
Console.WriteLine("这是Line里面的Draw方法");
}
}
classAngle
{
publicvoidDrawAngle()
{
Console.WriteLine("这是Angle里面的DrawAngle方法");
}
}
classAdapterAngle:
IDrawing
{
privateAngleag=newAngle();
publicoverridevoidDraw()
{
ag.DrawAngle();
}
}
classProgram
{
staticvoidMain(string[]args)
{
IDrawingcc=newCircle();
cc.Draw();
IDrawingrr=newRectangle();
rr.Draw();
IDrawingll=newLine();
ll.Draw();
IDrawingaa=newAdapterAngle();
aa.Draw();
Console.ReadKey();
}
}
}
运行结果:
实验小结:
适配器模式可以让任何两个没有关联的类一起运行,提高了类的复用,增加了类的透明度,灵活性好,但是过多的使用适配器,会让系统非常零乱,不易整体进行把握。
比如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。
因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
由于JAVA至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
实验六桥接模式的应用
1实验目的
1)掌握桥接模式(Bridge)的特点
2)分析具体问题,使用桥接模式进行设计。
2实验内容和要求
一个咖啡店可以提供大杯(JorumCoffee)、中杯(MediumCoffee)、小杯(SmallCoffee)的咖啡(Coffee),为了满足不同用户的口味,在咖啡中可以添加牛奶(Milk),或者糖(Sugar),或者柠檬(Lemon),提供给用户不同口味的组合,如大杯咖啡加牛奶,中杯咖啡加糖,小杯咖啡加柠檬,小杯咖啡加糖等。
应用桥接模式,用C#控制台应用程序实现该设计。
绘制该模式的UML图。
UML图:
源代码:
abstractclassSauce
{
publicabstractvoidMixing();
}
classMilk:
Sauce
{
publicoverridevoidMixing()
{
Console.WriteLine("加牛奶");
}
}
classSugar:
Sauce
{
publicoverridevoidMixing()
{
Console.WriteLine("加糖");
}
}
classLemon:
Sauce
{
publicoverridevoidMixing()
{
Console.WriteLine("加柠檬");
}
}
abstractclassCoffee
{
protectedSaucesauce;
publicvoidAddSauce(Saucesauce)
{
this.sauce=sauce;
}
publicabstractvoidMixing();
}
classJorumCoffee:
Coffee
{
publicoverridevoidMixing()
{
Console.Write("大杯咖啡");
sauce.Mixing();
}
}
classMediumCoffee:
Coffee
{
publicoverridevoidMixing()
{
Console.Write("中杯咖啡");
sauce.Mixing();
}
}
classSmallCoffee:
Coffee
{
publicoverridevoidMixing()
{
Console.Write("小杯咖啡");
sauce.Mixing();
}
}
classProgram
{
staticvoidMain(string[]args)
{
//中杯咖啡加牛奶
CoffeecoffeeOne=newMediumCoffee();
coffeeOne.AddSauce(newMilk());
coffeeOne.Mixing();
//大杯咖啡加糖
CoffeecoffeeTwo=newJorumCoffee();
coffeeTwo.AddSauce(newSugar());
coffeeTwo.Mixing();
//小杯咖啡加糖
CoffeecoffeeThree=newSmallCoffee();
coffeeThree.AddSauce(newLemon());
coffeeThree.Mixing();
Console.ReadKey();
}
}
}
运行结果:
实验小结:
Bridge模式是一个非常有用的模式,也非常复杂,它很好的符合了开放-封闭原则和优先使用对象,而不是继承这两个面向对象原则。
该模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。
实验七装饰模式的应用
1实验目的
1)掌握装饰模式(Decorator)的特点
2)分析具体问题,使用装饰模式进行设计。
2实验内容和要求
“喜羊羊逃命”游戏:
喜羊羊被灰太狼追,喜羊羊最多5条命,灰太狼每咬到喜羊羊一次,喜羊羊就要少一条命。
在逃的过程中喜羊羊可以吃到三种苹果,吃“红苹果”可以给喜羊羊加上保护罩,吃“绿苹果”可以加快喜羊羊奔跑速度,吃“黄苹果”可以使喜羊羊趟着水跑。
应用装饰模式,用C#控制台应用程序实现该设计。
绘制该模式的UML图。
UML图:
源代码:
abstractclassState
{
publicabstractvoidShow();
}
classAnimal:
State
{
privatestringname;
publicAnimal(stringname)
{
this.name=name;
}
publicoverridevoidShow()
{
Console.WriteLine("的{0}",name);
}
}
abstractclassApple:
State
{
protectedStatecomponent;
publicvoidDecorator(Statecomponent)
{
ponent=component;
}
publicoverridevoidShow()
{
if(component!
=null)
{
component.Show();
}
}
}
classProtectiveCover:
Appl