《设计模式实验(共64页).docx》由会员分享,可在线阅读,更多相关《设计模式实验(共64页).docx(64页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上代码重构与设计模式课堂实验徐海蛟博士 2016.03专心-专注-专业实验一 工厂模式的应用【实验目的】1) 掌握工厂模式(Factory)的特点2) 分析具体问题,使用工厂模式进行设计。【实验内容和要求】有一个 OEM 制造商代理做 HP 笔记本电脑(Laptop),后来该制造商得到了更多的品牌笔记本电脑的订单 Acer、Lenovo、Dell,该 OEM 商发现,如果一次同时做很多个牌子的本本,有些不利于管理。利用工厂模式改善设计,用控制台应用程序实现该 OEM 制造商的工厂模式。该模式的 UML 图如下。【模式UML图】【模式代码(JAVA 语言实现)】publi
2、c class FactoryMethod / 主类 public static void main(String args) Computer c; Factory f = new DellFactory(); c = f.getComputerType(); c.ComputerType(); f = new LenovoFactory(); 1代码重构与设计模式课堂实验徐海蛟博士 2016.03 c = f.getComputerType(); c.ComputerType(); f = new AcerFactory(); c = f.getComputerType(); c.Comp
3、uterType(); interface Factory Computer getComputerType(); class DellFactory implements Factory Override public Computer getComputerType() return new Dell(); class AcerFactory implements Factory Override public Computer getComputerType() return new Acer(); class LenovoFactory implements Factory Overr
4、ide public Computer getComputerType() return new Lenovo(); /* * 电脑品牌 */ interface Computer public void ComputerType(); class Dell implements Computer Override public void ComputerType() / TODO Autogenerated method stub 2代码重构与设计模式课堂实验徐海蛟博士 2016.03 System.out.println(Dell Computer); class Acer impleme
5、nts Computer Override public void ComputerType() System.out.println(Acer Computer); class Lenovo implements Computer Override public void ComputerType() / TODO Autogenerated method stub System.out.println(Lenovo Computer); 【运行截图】【实验小结】通过本次实验,学会了使用工厂方法模式。工厂方法模式的适用性如下:当一个类不知道它所必须创建的对象的类时。当一个类希望由它的子类来指
6、定它所创建的对象时。当类将创建对象的职责委托给多个帮助子类中的某一个,并且希望将哪一个帮助子类是代理这一信息局部化时。3代码重构与设计模式课堂实验徐海蛟博士 2016.03实验二 抽象工厂模式的应用【实验目的】1) 掌握抽象工厂模式(Abstract Factory)的特点2) 分析具体问题,使用抽象工厂模式进行设计。【实验内容和要求】麦当劳(McDonalds)和肯德基(KFC)快餐店都经营汉堡(Hamburg)和可乐(Cola),用 JAVA 控制台应用程序实现这两个快餐店经营产品的抽象工厂模式。该模式的 UML 图如下。【模式 UML 图】【模式代码】 public class Abst
7、ractFactoryTest public static void main(String args) Hamburg h; Cola c; AbstractFactory af = new MDNFactory(); 4代码重构与设计模式课堂实验徐海蛟博士 2016.03 h = af.createHamburg(); c = af.createCola(); h.getHumburg(); c.getCola(); af = new KDJFactory(); h = af.createHamburg(); c = af.createCola(); h.getHumburg(); c.g
8、etCola(); interface AbstractFactory Hamburg createHamburg(); Cola createCola(); class MDNFactory implements AbstractFactory Override public Hamburg createHamburg() return new MDNHamburg(); Override public Cola createCola() return new MDNCola(); class KDJFactory implements AbstractFactory Override pu
9、blic Hamburg createHamburg() return new KDJHamburg(); Override public Cola createCola() return new KDJCola(); /* * kDJ & */ interface Hamburg 5代码重构与设计模式课堂实验徐海蛟博士 2016.03 void getHumburg(); class MDNHamburg implements Hamburg Override public void getHumburg() System.out.println(MDNHamburg); class KDJ
10、Hamburg implements Hamburg Override public void getHumburg() / TODO Autogenerated method stub System.out.println(KDJHamburg); interface Cola void getCola(); class MDNCola implements Cola Override public void getCola() System.out.println(MDNCola); class KDJCola implements Cola Override public void ge
11、tCola() System.out.println(KDJCola); 【运行截图】 6代码重构与设计模式课堂实验徐海蛟博士 2016.03【实验小结】抽象工厂模式主要适用于以下情况:一系列要独立于它的产品的创建、组合和表示时。、一个系统要由多个产品系列中的一个来配置时。当要强调一系列相关的产品对象的设计以便进行联合使用时。当要提供一个产品类库,而只要显示它们的接口而不是实现时。7代码重构与设计模式课堂实验徐海蛟博士 2016.03实验三 适配器模式的应用【实验目的】1) 掌握适配器模式(Adapter)的特点2) 分析具体问题,使用适配器模式进行设计。【实验内容和要求】一个软件团队开发绘图
12、系统,设计了圆对象(Circle)、矩形对象(Rectangle),线对象(Line)都支持 Draw()函数,即可以通过 Draw()函数绘制图形。为了加快项目进度,将角度对象(Angle)绘制功能交给了合作团队实现。但合作团队将角度对象绘制函数定为了 DrawAngle()。绘图系统提供给用户后,用户不满意,希望能统一的调用,不用记太多命令。应用适配器模式,用 JAVA 控制台应用程序完善该设计。该模式的 UML 图如下。【模式UML图】【模式代码】public class AdapterTest public static void main(String args) Paint a =
13、 new AngleAdapter(); a.draw(); 8代码重构与设计模式课堂实验interface Paint 徐海蛟博士 2016.03 void draw(); class Circle implements Paint Override public void draw() System.out.println(圆圆); class Rectangle implements Paint Override public void draw() System.out.println(方方); class Line implements Paint Override public v
14、oid draw() System.out.println(线线); class Angle public void DrawAngle() System.out.println(角度); class AngleAdapter implements Paint private Angle a=new Angle(); Override public void draw() / TODO Autogenerated method stub a.DrawAngle(); 【运行截图】9代码重构与设计模式课堂实验徐海蛟博士 2016.03【实验小结】适配器模式主要适用于以下情况:当想要使用一个已经存
15、在的类,但是该类的接口不符合现有的需求时。当需要创建一个可以被复用的类,该类能够与其他无关的类甚至无法预见的类协同工作时。当需要使用一个已经存在的子类,但是不可能对所有的都进行子类化以匹配他们的接口时,对象适配器可以对其父类接口进行适配。10代码重构与设计模式课堂实验徐海蛟博士 2016.03实验四 桥接模式的应用【实验目的】1) 掌握桥接模式(Bridge)的特点2) 分析具体问题,使用桥接模式进行设计。【实验内容和要求】一 个 咖 啡 店 可 以 提 供 大 杯 (JorumCoffee) 、 中 杯 (MediumCoffee) 、 小 杯(SmallCoffee)的咖啡(Coffee)
16、,为了满足不同用户的口味,在咖啡中可以添加牛奶(Milk),或者糖(Sugar),或者柠檬(Lemon),提供给用户不同口味的组合,如大杯咖啡加牛奶,中杯咖啡加糖,小杯咖啡加柠檬,小杯咖啡加糖等。应用桥接模式,用 JAVA 控制台应用程序实现该设计。该模式的 UML 图如下。【模式类图】【模式代码】package Constructor; public class BridgeTest public static void main(String args) Bridge b; b=new Sugar(); 11代码重构与设计模式课堂实验徐海蛟博士 2016.03 b.setCoffee(ne
17、w JorumCoffee(); b.getCoffee(); b=new Milk(); b.setCoffee(new SmallCoffee(); b.getCoffee(); interface Coffee void getCoffee(); class JorumCoffee implements Coffee Override public void getCoffee() / TODO Autogenerated method stub System.out.print(大杯咖啡); class MediumCoffee implements Coffee Override p
18、ublic void getCoffee() / TODO Autogenerated method stub System.out.print(中杯咖啡); class SmallCoffee implements Coffee Override public void getCoffee() / TODO Autogenerated method stub System.out.print(小杯咖啡); /* * 配料 */ abstract class Bridge protected Coffee c; void setCoffee(Coffee co) c=co; public vo
19、id getCoffee() c.getCoffee(); 12代码重构与设计模式课堂实验 class Sugar extends Bridge 徐海蛟博士 2016.03 Override public void getCoffee() c.getCoffee(); System.out.println(加糖); class Milk extends Bridge Override public void getCoffee() c.getCoffee(); System.out.println(加牛奶); class Lemon extends Bridge Override public
20、 void getCoffee() c.getCoffee(); System.out.println(加柠檬); 【运行截图】【实验小结】桥接模式的适用情况有:当不希望在抽象和它的实现之间有一个固定的绑定关系时。当类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充时。当对一个抽象类的实现部分的修改应对客户不产生影响时。13代码重构与设计模式课堂实验徐海蛟博士 2016.03实验五 装饰模式的应用【实验目的】1) 掌握装饰模式(Decorator)的特点2) 分析具体问题,使用装饰模式进行设计。【实验内容和要求】“喜羊羊逃命”游戏:喜羊羊被灰太狼追,喜羊羊最多 5 条命,灰太狼每咬到喜羊
21、羊一次,喜羊羊就要少一条命。在逃的过程中喜羊羊可以吃到三种苹果,吃“红苹果”可以给喜羊羊加上保护罩,吃“绿苹果”可以加快喜羊羊奔跑速度,吃“黄苹果”可以使喜羊羊趟着水跑。应用装饰模式,用 JAVA 控制台应用程序实现该设计。绘制该模式的 UML 图。提示:这个例子如果用类的继承来实现的话那可就麻烦了,你需要为喜羊羊派生 3*2*1=6 个子类(有保护罩的喜羊羊,奔跑速度加快的喜羊羊,会趟水的喜羊羊,既有保护罩又会趟水的喜羊羊,奔跑速度快且会趟水的喜羊羊,有保护罩且奔跑速度快的喜羊羊,有保护罩、奔跑速度快且会趟水的喜羊羊),如果使用装饰模式的那就不用派生诸多子类了,当喜羊羊每吃到一个苹果,我们就
22、用装饰模式给喜羊羊加一个动态增加一个新功能即可。【模式类图】14代码重构与设计模式课堂实验【模式代码】 public class DecoratorTest01 徐海蛟博士 2016.03 public static void main(String args) ConcreteXiYY cxyy=new ConcreteXiYY(); ProtectXiYangyang px=new ProtectXiYangyang(); FastXiYangyang fx=new FastXiYangyang(); SwimingXiYangyang sx=new SwimingXiYangyang()
23、; px.setXiYangyang(cxyy); px.Operation(); fx.setXiYangyang(px); fx.Operation(); sx.setXiYangyang(fx); sx.Operation(); interface XiYangyang public void Operation(); class ConcreteXiYY implements XiYangyang Override public void Operation() / TODO Autogenerated method stub System.out.println(喜羊羊); abst
24、ract class Decorator implements XiYangyang protected XiYangyang xyy; public void setXiYangyang(XiYangyang xyy) this.xyy=xyy; Override public void Operation() / TODO Autogenerated method stub xyy.Operation(); 15代码重构与设计模式课堂实验徐海蛟博士 2016.03 class ProtectXiYangyang extends Decorator Override public void
25、Operation() / TODO Autogenerated method stub System.out.print( 有保护罩的); super.Operation(); class FastXiYangyang extends Decorator Override public void Operation() / TODO Autogenerated method stub System.out.print( 加速的); super.Operation(); class SwimingXiYangyang extends Decorator Override public void
26、 Operation() / TODO Autogenerated method stub System.out.print( 会游泳的); super.Operation(); 【运行截图】【实验小结】装饰模式的适用情况有:当需要以不影响其他对象为前提实现动态、透明地给单个对象添加职责时。当需要将对象的某些职责进行撤销操作时。当不能用生成子类的方法进行当前系统的扩充时。16代码重构与设计模式课堂实验徐海蛟博士 2016.03实验六 代理模式的应用【实验目的】1) 掌握代理模式(Proxy)的特点2) 分析具体问题,使用代理模式进行设计。【实验内容和要求】生产商(Factory)需要销售商品(
27、Product),网上商城(E-Shop)提供了一个平台,可以帮助销售这些商品,获得更大的销量。当顾客(Custom)从网上商城选购商品的时候,实际是从生产商获得的商品。应用代理模式,用 JAVA 控制台应用程序改进该设计。绘制该模式的 UML 图。【模式UML图】【实验代码】 public class ProxyTest01 17代码重构与设计模式课堂实验徐海蛟博士 2016.03 public static void main(String args) / TODO Autogenerated method stub E_shop es=new E_shop(); es.product()
28、; abstract class Product public abstract void product(); class Factory extends Product Override public void product() / TODO Autogenerated method stub System.out.println(商品正在促销中,满一百减 50.); class E_shop extends Product private Factory factory; public E_shop() factory=new Factory(); Override public vo
29、id product() / TODO Autogenerated method stub factory.product(); 【运行截图】【实验小结】代理模式的有以下几种适用情况:当需要为一个对象在不同的地址空间提供局部的代表时。当需要创建开销非常大的对象时。当需要控制原始对象的访问时。当需要再访问对象时执行一些附加操作时,比如通过代理对象计算访问实际对象的次数。18代码重构与设计模式课堂实验徐海蛟博士 2016.03实验七 观察者模式的应用【实验目的】1) 掌握外观模式(Observer)的特点2) 分析具体问题,使用外观模式进行设计。【实验内容和要求】网上商店中如果商品(product
30、)在名称(name)、价格(price)等方面有变化,系统能自动通知会员,将是网上商店区别传统商店的一大特色。如何设计实现? 说明你所选择的设计模式,画出类关系图并指明各个类的角色。应用外观模式,用 JAVA 控制台应用程序改进该设计。绘制该模式的 UML 图。【模式 UML 图】【模式代码】 import java.util.ArrayList; public class ObeserverTest public static void main(String args) / TODO Autogenerated method stub ConcreteSubject cs=new Conc
31、reteSubject(); cs.Attach(new ConcreteObserver(cs, 1 号会员); cs.Attach(new ConcreteObserver(cs, 2 号会员); cs.Attach(new ConcreteObserver(cs, 3 号会员); cs.Attach(new ConcreteObserver(cs, 4 号会员); cs.setState(C+编程思想价钱下降 100 元); 19代码重构与设计模式课堂实验徐海蛟博士 2016.03 cs.Notify(); abstract class Observer public abstract
32、void update(); class ConcreteObserver extends Observer private String name; private String state; private ConcreteSubject cs; public ConcreteSubject getConcreteSubject() return cs; public void setConcreteSubject(ConcreteSubject cs) this.cs=cs; public ConcreteObserver(ConcreteSubject cs,String name)
33、this.cs=cs; this.name=name; Override public void update() / TODO Autogenerated method stub state=cs.getState(); System.out.println(name+观察到的状态是:+state); abstract class Subject private ArrayList observers=new ArrayList(); public void Attach(Observer o) observers.add(o); public void Detach(Observer o) observers.remove(o); /通知 public void No