




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、©武彩V披尤学_ Wuhan University of Science & Technology计算机科学与技术学院实 验 报 告课程名称:软件设计模式专业:计算机科学与技术班 级: 2011 级 1 班学与:201113137040姓名:刘进平实验一单例模式的应用1实验目的1) 掌握单例模式(Singleton)的特点2) 分析具体问题,使用单例模式进行设计。2实验内容和要求很多应用项目都有配置文件,这些配置文件里面定义一些应用需要的参数数 据。通常客户端使用这个类是通过 new 一个AppConfig的实例来得到一个操作 配置文件内容的对象。如果在系统运行中,有很多地方
2、都需要使用配置文件的内 容,系统中会同时存在多份配置文件的内容,这会严重浪费内存资源。事实上,对丁 AppConfig类,在运行期间,只需要一个对象实例就够了。那 么应该怎么实现呢?用C树空制台应用程序实现该单例模式。绘制该模式的UML 图。UML 图:AppConfig-ParameterA : string+GetParameterA()+SetParameterA()源代码:class Programstatic void Main( string args)AppConfig appConfigOne = AppConfig .GetParameterA();AppConfig app
3、ConfigTwo = AppConfig .GetParameterA();if (appConfigOne.Equals(appConfigTwo)else(Console.WriteLine( "appConfigOne 和 appConfigTwo 代表的是不同的实例!"); 1Console.ReadKey();运行结果: fi I e:/C:/U se r&/ LvYo ng/Des kto. 一 n Ia-ppConFisfOne 和 appConF代表的是同一个买例!实验小结:通过这次实验,我了解了单例模式的具体概念和使用方法,并且感受到了他的优点带
4、来的方便,但是同时也知道了该设计模式的缺点:由于单例模式中没有抽象层,因此单例类的扩展有很大困难。实验二工厂模式的应用1实验目的1)掌握工厂模式(Factory)的特点2)分析具体问题,使用工厂模式进行设计。2实验内容和要求有一个OEM制造商代理做HP笔记本电脑(Laptop),后来该制造商得到了更 多的品牌笔记本电脑的订单 Acer, Lenovo, Dell,该OEM商发现,如果一次同C#空制Uif CiNteMxc# 瞄中IE QflH&U村 B, M-i M临寻 <源代码:class Laptop(public virtual void GetLaptop() ( )cl
5、ass HpLaptop: Laptop(class AcerLaptop : Laptop (public override void GetLaptop()(public override void GetLaptop()xConsole.WriteLine("生产了一台 Lenovo电脑");时做很多个牌子的本本,有些不利丁管理。利用工厂模式改善设计,用台应用程序实现该OEM制造商的工厂模式。绘制该模式的 UML图UML 图:) class DellLaptop : Laptop(public override void GetLaptop()(Console.Wri
6、teLine("生产了一台 Dell 电脑");)interface IFactory(Laptop CreateFactory();)class HpFactory : IFactory(public Laptop CreateFactory()(return new HpLaptop();)class AcerFactory : IFactory(public Laptop CreateFactory() (return new AcerLaptop ();)class LenovoFactory : IFactory(public Laptop CreateFacto
7、ry()(return new LenovoLaptop();) )class DellFactory : IFactory(public Laptop CreateFactory() (return new DellLaptop ();)classProgram(static void Main( string args)IFactory laptopFactory = new LenovoFactory ();IFactorylaptopFactoryl=new HpFactory ();IFactorylaptopFactory2=new AcerFactory ();IFactoryl
8、aptopFactory3=new DellFactory ();Laptop laptop = laptopFactory.CreateFactory();Laptop laptop1 = laptopFactory1.CreateFactory();Laptop laptop2 = laptopFactory2.CreateFactory();Laptop laptop3 = laptopFactory3.CreateFactory();laptop.GetLaptop();laptop1.GetLaptop();laptop2.GetLaptop();laptop3.GetLaptop(
9、);Console.ReadKey();运行结果:台台<1苔 -TTT7产产产产龟电j r 1实验小结:通过本次实验,我了解了工厂模式的适用范围和他的一些特点,工厂模式在一定程度上解决某些代码违反了面向对象设计的开放封闭原则。同时还了解了它的一些优点和弊端,比如: 使用工厂方法模式的另一个优点是在系统中加入新产品时,无需修改抽象工厂和抽象产品提供的接口,无需修改客户端,也无需修改其它的具体工厂和具体产品,而只要添加一个新的具体工厂和具体产品即可。实验三抽象工厂模式的应用1实验目的1)掌握抽象工厂模式(Abstract Factory)的特点2)分析具体问题,使用抽象工厂模式进行设计。2实
10、验内容和要求麦当劳(McDonalds)和肯德基(KFC)快餐店都经营汉堡(Hamburg)和 可乐(Cola),用C#控制台应用程序实现这两个快餐店经营产品的抽象工厂模式。 绘制该模式的UML图。UML 图:出在同一个UML顼U中不能网札所以&为Fact叫1,代四中依然是 Factorv+ Drink。: void源代码:interface IHamburgvoid HamburgName();)class McDonaldsHamburg: IHamburg(class KFCHamburg IHamburginterface ICola(void ColaName();)clas
11、s McDonaldsCola : ICola(class KFCCola : ICola(public void ColaName()Console.WriteLine("这是 KFC Cola");)interface IFactoryIHamburg CreateHamburg();ICola CreateCola();)class McDonaldsFactory : IFactorypublic IHamburg CreateHamburg()return new McDonaldsHamburg);)public ICola CreateCola()( retu
12、rn new McDonaldsCola();_)class KFCFactory : IFactory(public IHamburg CreateHamburg()(return new KFCHamburg;public ICola CreateCola()(二return new KFCCola();class ProgramZ(二static void Main( string args)(IFactory factory = new KFCFactory ();IFactory factory1 = new McDonaldsFactory ();IHamburg hamburg1
13、 = factory1.CreateHamburg();ICola cola1 = factory1.CreateCola();IHamburg hamburg = factory.CreateHamburg();ICola cola = factory.CreateCola();hamburg.HamburgName();cola.ColaName();hamburg1.HamburgName();cola1.ColaName();Console.ReadKey();运行结果:.I file:/C:/U5ers/LvYong/Desktop/®i.这号KFC HanbursrKSS
14、mFC Cola这是McDonalds Hamburg读正ncDdn&lflg Co la实验小结:通过本次实验,加深了对抽象工厂模式的理解。抽象工厂提供一个创建一系列相关或相互依 赖对象的接口,而不需指定他们具体的类。抽象工厂同样是存在缺点的,难以支持新种类的产品。 由于以前对C+不太了解,本次实验加深了对C+的了解,强化了编程能力。理解解了构造函数,虚函数,纯虚函数,成员函数实现,类之间的继承等含义。但对于函数的调用问题常常出错,这在以后的学习中应多加注意和练习。实验四建造者模式的应用1实验目的1)掌握建造者模式(Builder)的特点2)分析具体问题,使用建造者模式进行设计。2实
15、验内容和要求建造者模式是一种创建型模式,它主要是应对项目中一些复杂对象的创建工 作。所谓“复杂对象”,是指此对象中还含有其它的子对象。我们现在定义一个 场景:汽车生产必须包含车轮(Wheel)、油箱(OilBox)和车身(Body),应用建造者 模式,用C#控制台应用程序实现该设计,构建 BMW品牌和BenZ品牌汽车生 产。绘制该模式的UML图。UML 图:捕象指鼎睦徽<者Director0Builder-seFartG : void + g etc arC Car+ GetBMW。: Car+ &etBenZ(j: Car><心fi看OncreieDuilderCm
16、源代码:public abstract class ICar(public abstract void Wheel();public abstract void OilBox();public abstract void Body();class Benz: ICar(public override void Wheel()(-Console.Write("奔驰的轮子,");public override void OilBox()(Console.Write("奔驰的油箱,");public override void Body()(Console.W
17、riteLine("奔驰的车体!");class BMWICar(public override void Wheel()(Console.Write("宝马的轮子,");) public override void OilBox()(Console.Write("宝马的油箱,");)public override void Body()(Console.WriteLine("宝马的车体!");)class Driver( -public void include( ICar car)(car.Wheel();ca
18、r.Oi lB ox();car.Body();)class Program=( Zlstatic void Main( string args)(ICar car = new Benz();ICar car1 = new BMDriver zhangsan = new Driver ();zhangsan.include(car);Driver lisi = new Driver ();lisi.include(car1);Console.ReadKey();实验小结:建造者模式的设计目的是消除其他对象的复杂创建过程。使用建造者模式不 仅是最佳的做法,而且在某个对象的构建和配制方法改变时可以
19、尽量减少重复更 改代码实验五适配器模式的应用1实验目的1) 掌握适配器模式(Adapter-)的特点2) 分析具体问题,使用适配器模式进行设计。2实验内容和要求一个软件团队开发绘图系统,设计了圆对象(Circle)、矩形对象(Rectangle),线对象(Line)都支持Draw()函数,即可以通过Draw()函数绘制图形。为了加快项目进度,将角度对象(Angle)绘制功能交给了合作团队实现。但合作团队将角度对象绘制函数定为了 DrawAngle()。绘图系统提供给用户后,用户不满意,希望 能统一的调用,不用记太多命令。应用适配器模式,用C#控制台应用程序完善该设计。绘制该模式的UML图。UM
20、L 图:>hfl > 一源代码:abstract class IDrawing(public abstract void Draw();)class Circle : IDrawing(public override void Draw()(Console.WriteLine("这是Circle 里面的 Drag法");_class Rectangle : IDrawing(public override void Draw()(Console.WriteLine("这是 Rectangle 里面的 Draw方法");class Line :
21、 IDrawing(public override void Draw()(Console.WriteLine("这是 Line 里面的 Draw方法”);class Angle(class AdapterAngle : IDrawing(private Angle ag = new Angle ();public override void Draw()( static void Main( string args)(IDrawing cc = new Circle (); cc.Draw();IDrawing rr = new Rectangle (); rr.Draw();ID
22、rawing ll = new Line ();ll.Draw();IDrawing aa = new AdapterAngle (); aa.Draw();Console.ReadKey(); |运行结果:一I: fil£:/C:/UserVLvYBng/D妙sktop段件设计模一:U里面的Dmw方邕、 这是RcGtnsrle里面的Draw方法 fe&Linei面句1>1"时为法、这是A n g 。里面的I Drawft ngle方法实验小结:适配器模式可以让任何两个没有关联的类一起运行,提高了类的复用,增加了类的透明度灵活性好,但是过多的使用适配器,会让系
23、统非常零乱,不易整体进行把握。比如,明明看到调用的是A接口,其实内部被适配成了 B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 由于JAVA至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。实验六桥接模式的应用1实验目的1) 掌握桥接模式(Bridge)的特点2) 分析具体问题,使用桥接模式进行设计。2实验内容和要求一个 咖啡店 可以提 供大杯(JorumCoffee)、中 杯(MediumCoffee)、小杯 (SmallCoffee)的咖啡(Coffee),为了满足不同用户的口味,在咖啡中可以
24、添加牛奶 (Milk),或者糖(Sugar),或者柠檬(Lemon),提供给用户不同口味的组合,如大 杯咖啡加牛奶,中杯咖啡加糖,小杯咖啡加柠檬,小杯咖啡加糖等。应用桥接模 式,用C#®制台应用程序实现该设计。绘制该模式的UML图。UML 图:源代码:abstract class Saucepublic abstract void Mixing();(public override void Mixing()(Console.WriteLine("加牛奶");class Sugar : Saucepublic override void Mixing()(Cons
25、ole.WriteLine("加糖");class Lemon: Sauce(public override void Mixing()(Console.WriteLine("加柠檬”);)abstract class Coffee(protected Sauce sauce;this .sauce = sauce;)public abstract void Mixing();=class JorumCoffee : Coffee(public override void Mixing()class MediumCoffee : Coffee(public ove
26、rride void Mixing()(Console.Write("中杯咖啡”);sauce.Mixing();)class SmallCoffee : Coffee(public override void Mixing()(Console.Write("小杯咖啡”);sauce.Mixing();class Program(static void Main( string args)(/中杯咖啡加牛奶Coffee coffeeOne =new MediumCoffee ();coffeeOne.AddSauce(new Milk ();coffeeOne.Mixing
27、();/大杯咖啡加糖Coffee coffeeTwo = new JorumCoffee ();coffeeTwo.AddSauce( new Sugar();coffeeTwo.Mixing();小杯咖啡加糖new Lemon();Coffee coffeeThree = new SmallCoffee ();coffeeThree.AddSauce(coffeeThree.Mixing();Console.ReadKey();运行结果:fil e:/C:/Users/LvYong/Des kto p/软件.nu n n _ - _ . HL实验小结:Bridge模式是一个非常有用的模式,也
28、非常复杂,它很好的符合了开放-封闭原则和优先使用对象,而不是继承这两个面向对象原则。 该模式使用 对象间的组合关系”解耦了抽象和实 现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。实验七装饰模式的应用1实验目的1) 掌握装饰模式(Decorator)的特点2) 分析具体问题,使用装饰模式进行设计2实验内容和要求喜羊羊逃命”游戏:喜羊羊被灰太狼追,喜羊羊最多5条命,灰太狼每咬到 喜羊羊一次,喜羊羊就要少一条命。在逃的过程中喜羊羊可以吃到三种苹果, 吃 红苹果”可以给喜羊羊加上保护罩,吃 绿苹果”可以加快喜羊羊奔跑速度,吃黄 苹果”可以使喜羊羊趟着水跑。应用装饰模式,用C#空制台应用
29、程序实现该设计。 绘制该模式的UML图。UML 图:源代码:abstract class State(public abstract void Show();)class Animal : State(private string name;public Animal( string name)(this .name = name;)public override void Show()(Console.WriteLine("的0" , name);)abstract class Apple : State Jprotected State component;public
30、 void Decorator( State component) Jthis .component = component;public override void Show()if (component != null )component.Show();class ProtectiveCover : Applepublic override void Show()/base.Show();Console.Write("有保护罩"); base.Show();class RunFast : Applepublic override void Show()/base.Sh
31、ow();Console.Write("跑得快、"); base.Show();class FlowingWater : Apple(public override void Show()(/base.Show();Console.Write("会趟水、");base.Show();class Program(static void Main( string args)(Animal pleasantsheep = new Animal ("喜羊羊”); ProtectiveCover pc = new ProtectiveCover ();
32、RunFast rf = new RunFast();FlowingWater fw = new FlowingWater ();pc.Decorator(pleasantsheep);rf.Decorator(pc);fw.Decorator(rf);fw.Show();Console.ReadKey();运行结果: file:/C:/ U se rs/LvY o ng/Des kto牛设. 一会逝水、跑得快、有保护罩的喜羊羊一实验小结:Decorator模式采用对象组合而非继承的手法,实现了在运行时动态的扩展对象功能的能力,而且可以根据需要扩展多个功能,避免了单独使用继承带来的灵活性差”和
33、 多子类衍生问题”。同时它很好地符合面向对象设计原则中优先使用对象组合而非继承 ”和 开放-封闭”原则。实验八外观模式的应用1实验目的1)掌握外观模式(Facade的特点2)分析具体问题,使用外观模式进行设计。2实验内容和要求一个保安系统的,由录像机、电灯、红外线监控和警报器组成。保安系统的 操作人员需要经常将这些仪器启动和关闭。保安类需要用到所有的录像机 (Camera卜电灯(Light)、感应器(Sensor河警报器(Alarm)对象,保安觉得使用不 方便。应用外观模式,用 C#控制台应用程序改进该设计。绘制该模式的UML图。UML 图:源代码:public class Camerapub
34、lic void TurnOn() Console.WriteLine( "Turning on the camera.");public void TurnOff()Console.WriteLine( "Turning off the camera.");)public void Rotate( int degrees),degrees);Console.WriteLine( "Rotating the camera by 0 degrees.public class Lightpublic void TurnOff()Console.Wr
35、iteLine( "Turning on the light.");public void TurnOn()Console.WriteLine( "Turning off the light.");public void ChangeBulb()Console.WriteLine( "changing the light-bulb." );public class Sensor public void Activate()Console.WriteLine( "Activating the sensor.");pu
36、blic void Deactivate()Console.WriteLine( "Deactivating the sensor.");public void Trigger()Console.WriteLine( "The sensor has triggered." );public class Alarm public void Activate()( Console.WriteLine( "Activating the alarm.");Console.WriteLine( "Deactivating the al
37、arm.");public void Ring()(Console.WriteLine( "Ringing the alarm.");public void StopRing()(Console.WriteLine( "Stop the alarm.");public class SecurityFacade(privatestaticCameracamera1,camera2;privatestaticLight light1, light2,light3;privatestaticSensor sensor;privatestaticAla
38、rm alarm;static SecurityFacade()(camera1 =new Camerc();camera2 =new Camerc();light1 =newLight();light2 =newLight();light3 =newLight();sensor =newSensor();alarm = new Alarm();public void Activate()(camera1.TurnOn();camera2.TurnOn();light1.TurnOn();light2.TurnOn();light3.TurnOn();sensor.Activate();ala
39、rm.Activate();public void Deactivate()camera1.TurnOff();camera2.TurnOff();light1.TurnOff();light2.TurnOff();light3.TurnOff();sensor.Deactivate();alarm.Deactivate();class Program static void Main( string args) SecurityFacade security;security= newSecurityFacade ();_security.Activate();Console.WriteLi
40、ne( "nn");security.Deactivate();Console.ReadKey(); 运行结果: file/C:/User&/LvYong/Desktop/K(£l:®tt1S. 一 口 . Turrw in j?orw?the?car>e ra.AT Lti'n in3?on? tli&?c*ne ra.Turn?the? Llgflit -Tur insf?of f ?ther?li8fht.Act ruat ing(? tli&?ser*soi*_A&t at 土the?alai*n -
41、Turn lnsi?ofTuj'rilnsf?ofLf1?th&?caner,«.in9r?pn?the?Ligrht.Turning?on?the?light.TtiPft in(i?on?chB?li9ih(;.Deact ivatingrTths?&ensoi'wDe act; iwatingr?thc?alai'm*搜狗轮音输X法4 =J<> H实验小结:Fa?ade模式注重的是简化接口,它更多的时候是从架构的层次去看整个系统,而并非单个类的层次。该模式对客户屏蔽了子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起
42、来更加方便。 实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。实验九观察者模式的应用1实验目的1)掌握外观模式(Observe。的特点2)分析具体问题,使用外观模式进行设计。2实验内容和要求网上商店中如果商品(product:)在名称(name)、价格(price)等方面有变 化,系统能自动通知会员,将是网上商店区别传统商店的一大特色。如何设计实现?说明你所选择的设计模式,画出类关系图并指明各个类的角色。应用外观 模式,用C#®制台应用程序改进该设计。绘制该模式的UML图。UMLB:源代码:public cl
43、ass Product(public string name;public string price;public Product( string s_name, string s_price)(name = s_name;price = s_price;public Product()(-name = null ;price =null ;class ShopSystem(private IList <MemberObserver> observers = new List <MemberObserver>();public IList <Product >
44、; products = new List <Product >();public ShopSystem( IList <Product > pro)(products = pro;private string action;public void Attach( MemberObserver observer)(observers.Add(observer);public void Detach( MemberObserver observer)(observers.Remove(observer);public void Notify()(foreach ( Mem
45、berObserver mo in observers)mo.Update();public string ProductAction(get(action =null ;foreach ( Product p in products)(if ( != null | p.price != null )的价格变成了 " + p.price+ "n( action += +) return action;) set( action =value ;)class MemberObserver(private string name; private Sh
46、opSystem sub;public MemberObserver( string name, ShopSystem sub) (this .name = name;this .sub = sub;)public void Update()(Console.WriteLine( "0 请注意! 1 " , sub.ProductAction, name);)class Programstatic void Main( string args) Product productOne = new Product ();Product productTwo = new Product ("衬衫","125元/件");Product productThree = new Product ("短袖”,"60元/ 件”);IList <Product > products = new List <Product >();products.Add(productOne);products.Add(productTwo);products.Add(productThree);ShopSystem shopsystem = new ShopSystem(p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 办公自动化与医疗信息安全的关系研究
- 以用户为中心的创意产业与区块链版权结合之道
- 区块链技术革新医疗数据共享的密钥
- 办公空间中的医疗品牌建设与信任文化建设
- 医疗行业中的商业模式创新与机遇探索
- 冀教版数学四年级下册-分数的意义教学设计
- 医疗教育中的伦理议题溶栓治疗案例教学
- AI赋能智慧办公推动健康监测智能化发展
- 区块链技术在实体产业的应用与前景分析
- 腹主动脉腔静脉瘘的临床护理
- 新生儿胸腔穿刺术
- 液气胸病人护理-查房
- 错颌畸形预防课件
- 国家中小学智慧教育平台培训专题讲座
- 培训行业用户思维分析
- 气体分析仪的使用与维护
- 23秋国家开放大学《小学语文教学研究》形考任务1-5参考答案
- 高中数学知识点全总结PPT
- 许昌职业技术学院教师招聘考试历年真题
- 六年级下册第四单元复习教学设计
- 临床微生物学检验技术-苏州大学中国大学mooc课后章节答案期末考试题库2023年
评论
0/150
提交评论