设计模式实验报告.doc_第1页
设计模式实验报告.doc_第2页
设计模式实验报告.doc_第3页
设计模式实验报告.doc_第4页
设计模式实验报告.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机科学与技术学院 实验报告课程名称: 软件设计模式 专 业: 计算机科学与技术班 级: DB1002 班 学 号: 201012137040 姓 名: 孙谦 实验一 单例模式的应用1 实验目的1) 掌握单例模式(Singleton)的特点2) 分析具体问题,使用单例模式进行设计。2 实验内容和要求很多应用项目都有配置文件,这些配置文件里面定义一些应用需要的参数数据。 通常客户端使用这个类是通过new一个AppConfig的实例来得到一个操作配置文件内容的对象。如果在系统运行中,有很多地方都需要使用配置文件的内容,系统中会同时存在多份配置文件的内容,这会严重浪费内存资源。事实上,对于AppConfig类,在运行期间,只需要一个对象实例就够了。那么应该怎么实现呢?用C#控制台应用程序实现该单例模式。绘制该模式的UML图。代码截图:namespace 实验一_单例模式_ class Program static void Main(string args) AppConfig appc1 = AppConfig.GetAppConfig(); AppConfig appc2 = AppConfig.GetAppConfig(); appc1.SetParameterA(hello); appc2.SetParameterA(hi); if (appc1.Equals(appc2) Console.WriteLine(appc1 和 appc2 代表的是同一个实例); else Console.WriteLine(appc1 和 appc2 代表的是不同实例); Console.WriteLine(appc1.GetParameterA(); Console.WriteLine(appc2.GetParameterA(); Console.ReadKey(); public class AppConfig private string ParameterA; private static AppConfig appc = null; /1:私有化构造方法,便于在内部控制创建实例的数目 private AppConfig() public static AppConfig GetAppConfig() if (appc = null) appc = new AppConfig(); return appc; public string GetParameterA() return ParameterA; public void SetParameterA(string ParameterA) this.ParameterA = ParameterA; 运行结果:实验二 工厂模式的应用1 实验目的1) 掌握工厂模式(Factory)的特点2) 分析具体问题,使用工厂模式进行设计。2 实验内容和要求有一个OEM制造商代理做HP笔记本电脑(Laptop),后来该制造商得到了更多的品牌笔记本电脑的订单Acer,Lenovo,Dell,该OEM商发现,如果一次同时做很多个牌子的本本,有些不利于管理。利用工厂模式改善设计,用C#控制台应用程序实现该OEM制造商的工厂模式。绘制该模式的UML图。代码截图: abstract class Laptop private string laptopName; public abstract string produce(); class HP : Laptop / Acer、Lenovo、Dell类似 public override string produce() return (成产HP电脑); / 工厂方法 interface LaptopFactory Laptop CreateLaptop();/ 专门负责生产“HP”的工厂class HPFactory:LaptopFactory / Acer、Lenovo、Dell类似 public Laptop CreateLaptop() return new HP(); static void Main(string args) LaptopFactory lapf= new HPFactory(); Laptop lap = lapf.CreateLaptop(); Console.WriteLine(结果是: + duce(); LaptopFactory lapf2 = new AcerFactory(); lap = lapf2.CreateLaptop(); Console.WriteLine(结果是: + duce(); Console.ReadKey();运行结果:实验三 抽象工厂模式的应用1 实验目的1) 掌握抽象工厂模式(Abstract Factory)的特点2) 分析具体问题,使用抽象工厂模式进行设计。2 实验内容和要求麦当劳(McDonalds)和肯德基(KFC)快餐店都经营汉堡(Hamburg)和可乐(Cola),用C#控制台应用程序实现这两个快餐店经营产品的抽象工厂模式。绘制该模式的UML图。代码截图:/汉堡(“可乐”与此类似)interface Hamburg string produceHamburg();class KFChb: Hamburg public string produceHamburg() return (KFC Hamburg);class McDonaldshb : Hamburg public string produceHamburg() return (McDonalds Hamburg); interface FoodFactory Hamburg CreateHamburg(); Cola CreateCola();class KFCFactory : FoodFactory public Hamburg CreateHamburg() return new KFChb(); public Cola CreateCola() return new KFCcl(); static void Main(string args) FoodFactory factory = new KFCFactory(); /KFCFactory(); FoodFactory factory2 = new McDonaldsFactory(); Hamburg hb = factory.CreateHamburg(); Cola cl = factory2.CreateCola(); Console.WriteLine(结果是: + duceHamburg(); Console.WriteLine(结果是: + duceCola(); Console.ReadKey();运行结果:实验四 建造者模式的应用1 实验目的1) 掌握建造者模式(Builder)的特点2) 分析具体问题,使用建造者模式进行设计。2 实验内容和要求建造者模式是一种创建型模式,它主要是应对项目中一些复杂对象的创建工作。所谓“复杂对象”,是指此对象中还含有其它的子对象。我们现在定义一个场景:汽车生产必须包含车轮(Wheel)、油箱(OilBox)和车身(Body),应用建造者模式,用C#控制台应用程序实现该设计,构建BMW品牌和BenZ品牌汽车生产。绘制该模式的UML图。代码截图:class Car private string wheel; private string oilBox; private string body; public string Wheel / OilBox、Body 类似,此处省略代码 set wheel = value; get return wheel; public void Introduce() Console.WriteLine(Wheel); Console.WriteLine(OilBox); Console.WriteLine(Body); Console.WriteLine(); abstract class CarBuilder protected Car car = new Car(); public abstract void BuildWheel(); public abstract void BuildOilBox(); public abstract void BuildBody(); public Car GetResult() return car;class ConcreteBuilderBMW : CarBuilder /BenZ类似,省略 public override void BuildWheel() car.Wheel = Finish Wheel for BMWcar; /BuildOilBox()、BuildBody() class Director /指挥者类 private CarBuilder builder; public Director(CarBuilder builder) this.builder = builder; public void SetBuilder(CarBuilder builder) this.builder = builder; public void Construct() builder.BuildWheel(); builder.BuildOilBox(); builder.BuildBody(); static void Main(string args) Car car; CarBuilder cbd = new ConcreteBuilderBMW(); Director dt = new Director(cbd); dt.Construct(); car = cbd.GetResult(); car.Introduce(); cbd = new ConcreteBuilderBenZ(); dt.SetBuilder(cbd); dt.Construct(); car = cbd.GetResult(); car.Introduce(); Console.ReadKey();运行结果:实验五 适配器模式的应用1 实验目的1) 掌握适配器模式(Adapter)的特点2) 分析具体问题,使用适配器模式进行设计。2 实验内容和要求一个软件团队开发绘图系统,设计了圆对象(Circle)、矩形对象(Rectangle),线对象(Line)都支持Draw()函数,即可以通过Draw()函数绘制图形。为了加快项目进度,将角度对象(Angle)绘制功能交给了合作团队实现。但合作团队将角度对象绘制函数定为了DrawAngle()。绘图系统提供给用户后,用户不满意,希望能统一的调用,不用记太多命令。应用适配器模式,用C#控制台应用程序完善该设计。绘制该模式的UML图。 abstract class Picture protected string name; public Picture(string name) = name; public abstract void Draw(); class Circle : Picture /圆对象(Rectangle、Rectangle) public Circle(string name): base(name) / = name; public override void Draw() Console.WriteLine(Draw circle:+ name); class Angle /角度 private string name; public string Name get return name; set name = value; public void DrawAngle() Console.WriteLine(Draw angle:+name); class Translator : Picture /翻译者 private Angle angle = new Angle(); public Translator(string name): base(name) angle.Name = name; public override void Draw() angle.DrawAngle(); static void Main(string args) Picture cc = new Circle(huayuan); cc.Draw(); Picture rr = new Rectangle(huajuxing); rr.Draw(); Picture aa = new Translator(画角); aa.Draw(); Console.Read();运行结果:实验六 桥接模式的应用1 实验目的1) 掌握桥接模式(Bridge)的特点2) 分析具体问题,使用桥接模式进行设计。2 实验内容和要求一个咖啡店可以提供大杯(JorumCoffee)、中杯(MediumCoffee)、小杯(SmallCoffee)的咖啡(Coffee),为了满足不同用户的口味,在咖啡中可以添加牛奶(Milk),或者糖(Sugar),或者柠檬(Lemon),提供给用户不同口味的组合,如大杯咖啡加牛奶,中杯咖啡加糖,小杯咖啡加柠檬,小杯咖啡加糖等。应用桥接模式,用C#控制台应用程序实现该设计。绘制该模式的UML图。主要代码: abstract class Peiliao /配料 public abstract void Add();class Milk :Peiliao /牛奶配料 / Sugar、Lemon类似,省略 public override void Add() Console.WriteLine(加牛奶); abstract class Coffee /咖啡 protected Peiliao peiliao; /添加配料 public void addPeiliao(Peiliao peiliao) this.peiliao = peiliao; /添加 public abstract void Add();class JorumCoffee : Coffee /大杯咖啡 /中杯、小杯类似,省略 public override void Add() Console.Write(大杯咖啡); peiliao.Add(); static void Main(string args) Coffee cf; cf = new JorumCoffee(); cf.addPeiliao(new Milk(); cf.Add(); cf = new MediumCoffee(); cf.addPeiliao(new Sugar(); cf.Add(); Console.Read();运行结果:实验七 装饰模式的应用1 实验目的1) 掌握装饰模式(Decorator)的特点2) 分析具体问题,使用装饰模式进行设计。2 实验内容和要求“喜羊羊逃命”游戏:喜羊羊被灰太狼追,喜羊羊最多5条命,灰太狼每咬到喜羊羊一次,喜羊羊就要少一条命。在逃的过程中喜羊羊可以吃到三种苹果,吃“红苹果”可以给喜羊羊加上保护罩,吃“绿苹果”可以加快喜羊羊奔跑速度,吃“黄苹果”可以使喜羊羊趟着水跑。应用装饰模式,用C#控制台应用程序实现该设计。绘制该模式的UML图。提示:这个例子如果用类的继承来实现的话那可就麻烦了,你需要为喜羊羊派生3*2*1=6个子类(有保护罩的喜羊羊,奔跑速度加快的喜羊羊,会趟水的喜羊羊,既有保护罩又会趟水的喜羊羊,奔跑速度快且会趟水的喜羊羊,有保护罩且奔跑速度快的喜羊羊,有保护罩、奔跑速度快且会趟水的喜羊羊),如果使用装饰模式的那就不用派生诸多子类了,当喜羊羊每吃到一个苹果,我们就用装饰模式给喜羊羊加一个动态增加一个新功能即可。【主要代码】:abstract class Appearance public abstract void Show();class Sheep : Appearance /喜羊羊 private string name; public Sheep(string name) = name; public override void Show() Console.WriteLine(0, name); abstract class Apple : Appearance/苹果 protected Appearance component; public void Decorate(Appearance component) ponent = component; public override void Show() if (component != null) component.Show(); class RedApple : Apple / GreenApple、YellowApple public override void Show() Console.Write(有保护罩的); base.Show(); static void Main(string args) Sheep xyy= new Sheep(喜羊羊); Console.WriteLine(n第一种装扮:); RedApple ra = new RedApple(); GreenApple ga = new GreenApple(); YellowApple ya = new YellowApple(); ra.Decorate(xyy); ga.Decorate(ra); ya.Decorate(ga); ga.Show(); Console.WriteLine(n第二种装扮:); ya.Show(); Console.Read();【运行结果】: 实验八 外观模式的应用1 实验目的1) 掌握外观模式(Facade)的特点2) 分析具体问题,使用外观模式进行设计。2 实验内容和要求一个保安系统的,由录像机、电灯、红外线监控和警报器组成。保安系统的操作人员需要经常将这些仪器启动和关闭。保安类需要用到所有的录像机(Camera)、电灯(Light)、感应器(Sensor)和警报器(Alarm)对象,保安觉得使用不方便。应用外观模式,用C#控制台应用程序改进该设计。绘制该模式的UML图。【主要代码】:class Camera public void on() Console.WriteLine(录像机启动); public void off() Console.WriteLine(录像机关闭); /Light、Sensor、Alarm class SafeSysterm Camera camera; Light light; Sensor sensor; Alarm alarm; public SafeSysterm() camera = new Camera(); light = new Light(); sensor = new Sensor(); alarm = new Alarm(); public void onSafe() camera.on(); light.on(); sensor.on(); alarm.on(); public void offSafe() camera.off(); light.off(); sensor.off(); alarm.off(); static void Main(string args) SafeSysterm ss = new SafeSysterm(); ss.onSafe(); Console.WriteLine(n-n); ss.offSafe(); Console.Read();【运行结果】:实验九 观察者模式的应用1 实验目的1) 掌握外观模式(Observer)的特点2) 分析具体问题,使用外观模式进行设计。2 实验内容和要求网上商店中如果商品(product)在名称(name)、价格(price)等方面有变化,系统能自动通知会员,将是网上商店区别传统商店的一大特色。如何设计实现? 说明你所选择的设计模式,画出类关系图并指明各个类的角色。应用外观模式,用C#控制台应用程序改进该设计。绘制该模式的UML图。【主要代码】:abstract class Product / Fields protected string name; protected double price; private ArrayList guests = new ArrayList(); / Properties public double Price get return price; set price = value; Notify(); public string Name get return name; set name = value; / Constructor public Product(string name, double price) = name; this.price = price; / Methods public void Attach(Guest guest) guests.Add(guest); public void Detach(Guest guest) guests.Remove(guest); public void Notify() foreach (Guest i in guests) i.Update(this); / ConcreteSubjectclass NetshopProduct : Product / Constructor public NetshopProduct(string name, double price) : base(name, price) / Observerinterface IGuest / Methods void Update(Product product);/ ConcreteObserverclass Guest : IGuest / Fields private string name; private string observerState; private Product product; / Constructors public Guest(string name) = name; / Methods public void Update(Product product) Console.WriteLine(Notified guest 0 of 1s price change to 2:C,name, product.Name, product.Price); / Properties public Product Product get return product; set product = value; static void Main(string args) / Create guests Guest g1 = new Guest(张三); Guest g2 = new Guest(李四); / Create IBM stock and attach investors NetshopProduct ntsp = new NetshopProduct(NetshopProduct, 120.00); ntsp.Attach(g1); ntsp.Attach(g2); / Change pr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论