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