设计模式习题(共43页).doc
《设计模式习题(共43页).doc》由会员分享,可在线阅读,更多相关《设计模式习题(共43页).doc(43页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 模式 习题 43
限制150内