《设计模式习题(共43页).doc》由会员分享,可在线阅读,更多相关《设计模式习题(共43页).doc(43页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上一、 模式(Pattern)定义 策略模式(Strategy) 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。类图: Context(适用性): 1) 需要使用ConcreteStrategy提供的算法。2) 内部维护一个Strategy的实例。3) 负责动态设置运行时Strategy具体的实现算法。4) 负责跟Strategy之间的交互和数据传递。Strategy(抽象策略类): 定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般
2、使用接口或抽象类实现。ConcreteStrategy(具体策略类): 实现了Strategy定义的接口,提供具体的算法实现。适用性: 对于Strategy模式来说,主要有这些适用性: 1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。(例如FlyBehavior和QuackBehavior)2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。(例如FlyBehavior和QuackBehavior的具体实现可任意变化或扩充)3、 对客户(Duck)隐藏具体策略(算法)的实现细节,彼此完全独立。策略模式顺序图: 1
3、.观察者模式 定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。类图:P52主要解决问题: l 当一个抽象模型有两个方面的,其中一个方面依赖与另一个方面。l 当一个对象的改变需要同时改变其他对象,而不知道具体有多对象有待改变l 当一个对象必须通知其他对象,而它又不能假定其他对象是谁。生活中的例子: 观察者定义了对象间一对多的关系,当一个对象的状态变化时,所有依赖它的对象都得到通知并且自动地更新。拍卖演示了这种模式。每个投标人都有一个标有数字的牌子用于出价。拍卖师开始拍卖时,他观察是否有牌子举起出价。每次接受一个新的出价都改变了拍卖的
4、当前价格,并且广播给所有的投标人进行新的出价。图2 使用拍卖例子的观察者模式第一次试验实例: 1. 观察者模式适用场景 1) 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。2) 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。1. 类图及时序图(见图1、图2) 图1.设计类图图2.时序图1. 类的实现及代码测试 1)ChicagoPizzaStore类package com.finalcom;import com.finalpizza.ChicagoStyleCheesePizza;import com.finalpizza.ChicagoStyleP
5、epperoniPizza;import com.finalpizza.Pizza;public class ChicagoPizzaStore extends PizzaStore public Pizza createPizza(String item) if(item.equals(cheese) return new ChicagoStyleCheesePizza(); else if(item.equals(pepperoni) return new ChicagoStylePepperoniPizza(); else return null; 2)NYPizzaStore类pack
6、age com.finalcom;import com.finalpizza.*;public class NYPizzaStore extends PizzaStore public Pizza createPizza(String item) if(item.equals(cheese) return new NYStyleCheesePizza(); else if(item.equals(pepperoni) return new NYStylePepperoniPizza(); else return null; 3)PizzaStore抽象类package com.finalcom
7、;import com.finalpizza.*;public abstract class PizzaStore public Pizza orderPizza(String type) Pizza pizza; pizza=createPizza(type); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; protected abstract Pizza createPizza(String type);4)PizzaTestDrive类package com.finalcom;import c
8、om.finalpizza.*;public class PizzaTestDrive public static void main(String args) PizzaStore nyStore=new NYPizzaStore(); PizzaStore chicagoStore=new ChicagoPizzaStore(); Pizza pizza; pizza=nyStore.orderPizza(cheese);System.out.println(=); pizza=nyStore.orderPizza(pepperoni); System.out.println(=); pi
9、zza=chicagoStore.orderPizza(cheese); System.out.println(=); pizza=chicagoStore.orderPizza(pepperoni); System.out.println(=); 5)ChicagoStyleCheesePizza类package com.finalpizza;public class ChicagoStyleCheesePizza extends Pizza public ChicagoStyleCheesePizza() setName(Chicago Style Sauce and Cheese Piz
10、za); setDough(Extra Thin Crust Dough); setSauce(Plum Tomato Sauce); toppings.add(Shredded Mozzarella 10 ounce cheese); public void cut() System.out.println(Cutting the pizza into square slices); 6)ChicagoStylePepperoniPizza类package com.finalpizza;public class ChicagoStylePepperoniPizza extends Pizza
11、 public ChicagoStylePepperoniPizza() setName(Chicago Style Sauce and Pepperoni Pizza); setDough(Extra Thin Crust Dough); setSauce(Plum Tomato Sauce); toppings.add(Shredded Mozzarella 10 ounce pepperoni); public void cut() System.out.println(Cutting the pizza into square slices); 接右上角7)NYStyleCheeseP
12、izza类package com.finalpizza;public class NYStyleCheesePizza extends Pizza public NYStyleCheesePizza() setName(NY Style Sauce and Cheese Pizza); setDough(Thin Crust Dough); setSauce(Marinara Sauce); toppings.add(Grated Reggiano 5 ounce cheese); 8)NYStylePepperoniPizza类package com.finalpizza;public cl
13、ass NYStylePepperoniPizza extends Pizza public NYStylePepperoniPizza() setName(NY Style Sauce and Pepperoni Pizza); setDough(Thin Crust Dough); setSauce(Marinara Sauce); toppings.add(Grated Reggiano 5 ounce pepperoni); 9)Pizza抽象类package com.finalpizza;import java.util.ArrayList;public abstract class
14、 Pizza private String name; private String dough; private String sauce; ArrayList toppings=new ArrayList(); public void prepare() System.out.println(Preparing +name); System.out.println(Tossing dough. ); System.out.println(Adding sauce); System.out.print(Adding toppings: ); for(int i=0;itoppings.siz
15、e();i+) System.out.println(+toppings.get(i); public void bake() System.out.println(Bake for 25 minutes at 350); public void cut() System.out.println(Cutting the pizza into diagonal slices); public void box() System.out.println(Place pizza in official PizzaStore box); public String getName() return n
16、ame; public void setName(String name) this.name = name; public String getDough() return dough; public void setDough(String dough) this.dough = dough; public String getSauce() return sauce; public void setSauce(String sauce) this.sauce = sauce; public ArrayList getToppings() return toppings; public v
17、oid setToppings(ArrayList toppings) this.toppings = toppings;1. 2. 装饰模式(DECORATOR) 定义:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比集成更加有弹性的替代方案。类图:P91 生活中的例子: 装饰模式动态地给一个对象添加额外的职责。不论一幅画有没有画框都可以挂在墙上,但是通常都是有画框的,并且实际上是画框被挂在墙上。在挂在墙上之前,画可以被蒙上玻璃,装到框子里;这时画、玻璃和画框形成了一个物体。图2 使用有画框的画作为例子的装饰模式对象图主要解决问题 l 在不影响其他对象的情况下,以动态、透明的方式给单个
18、对象添加责任l 处理那些可以撤销的职责l 当不能采用生成子类的方法进行扩时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。适用性: 1.需要扩展一个类的功能,或给一个类增加附加责任。2.需要动态地给一个对象增加功能,这些功能可以再动态地撤销。3.需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。1. 3. 工厂方法模式(Factory Method)【P117去理解简单工厂模式,这里不列举】 定义:创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法
19、让类把实例化推迟到子类。类图:P134 第二次试验实例: 工厂模式的类图及其代码(如图4)图4.工厂模式的类图代码实现:1)ChicagoPizzaStore类package com.finalcom;import com.finalpizza.ChicagoStyleCheesePizza;import com.finalpizza.Pizza;public class ChicagoPizzaStore extends PizzaStore public Pizza createPizza(String item) if(item.equals(cheese) return new Chi
20、cagoStyleCheesePizza(); 3)PizzaStore抽象类package com.finalcom;import com.finalpizza.*;public abstract class PizzaStore public Pizza orderPizza(String type) Pizza pizza; pizza=createPizza(type); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; protected abstract Pizza createPizza(
21、String type);4)PizzaTestDrive类package com.finalcom;import com.finalpizza.*;public class PizzaTestDrive public static void main(String args) PizzaStore chicagoStore=new ChicagoPizzaStore(); Pizza pizza; pizza=chicagoStore.orderPizza(cheese); System.out.println(=); 5)ChicagoStyleCheesePizza类package co
22、m.finalpizza;public class ChicagoStyleCheesePizza extends Pizza public ChicagoStyleCheesePizza() setName(Chicago Style Sauce and Cheese Pizza); public void cut() System.out.println(Cutting the pizza into square slices); 9)Pizza抽象类package com.finalpizza;public abstract class Pizza private String name
23、; public void prepare() System.out.println(Preparing +name); public void bake() System.out.println(Bake for 25 minutes at 350); public void cut() System.out.println(Cutting the pizza into diagonal slices); public void box() System.out.println(Place pizza in official PizzaStore box); public String ge
24、tName() return name; public void setName(String name) this.name = name; 生活中的例子: 工厂方法定义一个用于创建对象的接口,但是让子类决定实例化哪个类。压注成型演示了这种模式。塑料玩具制造商加工塑料粉,将塑料注入到希望形状的模具中。玩具的类别(车,人物等等)是由模具决定的。适用性: 在以下情况下,适用于工厂方法模式:1.当一个类不知道它所必须创建的对象的类的时候。2.当一个类希望由它的子类来指定它所创建的对象的时候。3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候
25、1. 4. 抽象工厂方法(Abstract Factory) 定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 类图:P156 代码实现:第二次实验课:抽象工厂的类图及其代码(如图7)图7.抽象工厂的类图代码实现:(简化部分)1)NYPizzaStore类package com.abcom;import com.abpizzamaterial.CheesePizza;import com.abpizzamaterial.Pizza;public class NYPizzaStore extends PizzaStore protected Pizza createPi
26、zza(String item) Pizza pizza = null; PizzaIngredientFactory ingredientFactory = new NYPizzaIngredientFactory(); if(item.equals(cheese) pizza = new CheesePizza(ingredientFactory); pizza.setName(New York Style Cheese Pizza); return pizza; 2)PizzaIngtedientFactory接口package com.abcom;import com.abpizzam
27、aterial.Cheese;public interface PizzaIngredientFactory public Cheese createCheese();3)NYPizzaIngredientFactory类package com.abcom;import com.abpizzamaterial.*;public class NYPizzaIngredientFactory implements PizzaIngredientFactory public Cheese createCheese() return new ReggianoCheese(); 4)PizzaStore
28、类package com.abcom;import com.finalpizza.Pizza;public abstract class PizzaStore public Pizza orderPizza(String type) Pizza pizza; pizza=createPizza(type); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; protected abstract Pizza createPizza(String type);5)CheesePizza类package co
29、m.abpizzamaterial;import com.abcom.PizzaIngredientFactory;public class CheesePizza extends Pizza PizzaIngredientFactory ingredientFactory; public CheesePizza(PizzaIngredientFactory ingredientFactory) this.ingredientFactory=ingredientFactory; void prepare() System.out.println(Preparing + name); chees
30、e = ingredientFactory.createCheese(); 6)Pizza类package com.abpizzamaterial;public abstract class Pizza String name; Cheese cheese; public Pizza() abstract void prepare(); void bake() System.out.println(Bake for 25 minutes at 350); void cut() System.out.println(Cutting the pizza into diagonal slices);
31、 void box() System.out.println(Place pizza in offical PizzaStore box); public String getName() return name; public void setName(String name) this.name = name; public Cheese getCheese() return cheese; public void setCheese(Cheese cheese) this.cheese = cheese; 生活中的例子: 抽象工厂的目的是要提供一个创建一系列相关或相互依赖对象的接口,而不
32、需要指定它们具体的类。这种模式可以汽车制造厂所使用的金属冲压设备中找到。这种冲压设备可以制造汽车车身部件。同样的机械用于冲压不同的车型的右边车门、左边车门、右前挡泥板、左前挡泥板和引擎罩等等。通过使用转轮来改变冲压盘,这个机械产生的具体类可以在三分钟内改变。适用性: 在以下情况下应当考虑使用抽象工厂模式:1) 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。2) 这个系统有多于一个的产品族,而系统只消费其中某一产品族。3) 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。4) 系统提供一个产品类的库,所有的产品以同样的
33、接口出现,从而使客户端不依赖于实现。应用场景 1) 支持多种观感标准的用户界面工具箱(Kit)。2) 游戏开发中的多风格系列场景,比如道路,房屋,管道等。1. 5. 单例模式(Singleton) 定义:确保一个类仅有一个实例,并提供一个访问它的全局访问点。类图:P177 生活中的例子 美国总统的职位是Singleton,美国宪法规定了总统的选举,任期以及继任的顺序。这样,在任何时刻只能由一个现任的总统。无论现任总统的身份为何,其头衔美利坚合众国总统是访问这个职位的人的一个全局的访问点。主要解决问题: l 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时l 当这个唯一实例应该是通过
34、子类化可扩展的,并且客户应该无需更改代码就能使用适用性: 1) 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。2) 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。3) 1. 6. 命令模式 定义:将“请求”封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。类图:P207 第三次试验: 2.模拟MP3播放器的类图(如图1)图1.模拟MP3播放器的类图3. 模拟MP3播放器的时序图(如图2)图2.模拟MP3播放器的时序图代码实现(简化部分)1. Music类 package com.zhbit.da
35、o;public class Music String musicName; public Music() public Music(String musicName) this.musicName = musicName; public void on() System.out.println(musicName + 音乐播放); public void off() System.out.println(musicName + 音乐结束); 1. MusicOffCommand类 package com.zhbit.dao;import com.zhbit.inter.Command;pub
36、lic class MusicOffCommand implements Command Music music; public MusicOffCommand(Music music) this.music = music; public void execute() music.off(); public void undo() music.on(); 1. MusicOnCommand类 package com.zhbit.dao;import com.zhbit.inter.Command;public class MusicOnCommand implements Command M
37、usic music; public MusicOnCommand(Music music) this.music = music; public void execute() music.on(); public void undo() music.off(); 1. RemoteControlWithUndo类 package com.zhbit.dao;import com.zhbit.inter.Command;public class RemoteControlWithUndo Command onCommands; Command offCommands; Command undo
38、Command; public RemoteControlWithUndo() onCommands = new Command9; offCommands = new Command9; Command noCommand =new NoCommand(); for(int i = 0;i 9;i+) onCommandsi = noCommand; offCommandsi = noCommand; undoCommand = noCommand; public void setCommand(int slot,Command onCommand,Command offCommand) o
39、nCommandsslot = onCommand; offCommandsslot = offCommand; public void onButtonWasPushed(int slot) onCommandsslot.execute(); undoCommand = onCommandsslot; public void offButtonWasPushed(int slot) offCommandsslot.execute(); undoCommand = offCommandsslot; public void undoButtonWasPushed() undoCommand.undo();