




已阅读5页,还剩38页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、 模式(Pattern)定义 策略模式(Strategy) 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。类图: Context(适用性): 1) 需要使用ConcreteStrategy提供的算法。2) 内部维护一个Strategy的实例。3) 负责动态设置运行时Strategy具体的实现算法。4) 负责跟Strategy之间的交互和数据传递。Strategy(抽象策略类): 定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。ConcreteStrategy(具体策略类): 实现了Strategy定义的接口,提供具体的算法实现。适用性: 对于Strategy模式来说,主要有这些适用性: 1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。(例如FlyBehavior和QuackBehavior)2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。(例如FlyBehavior和QuackBehavior的具体实现可任意变化或扩充)3、 对客户(Duck)隐藏具体策略(算法)的实现细节,彼此完全独立。策略模式顺序图: 1.观察者模式(Observer Pattern) 定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。类图:P52主要解决问题: l 当一个抽象模型有两个方面的,其中一个方面依赖与另一个方面。l 当一个对象的改变需要同时改变其他对象,而不知道具体有多对象有待改变l 当一个对象必须通知其他对象,而它又不能假定其他对象是谁。生活中的例子: 观察者定义了对象间一对多的关系,当一个对象的状态变化时,所有依赖它的对象都得到通知并且自动地更新。拍卖演示了这种模式。每个投标人都有一个标有数字的牌子用于出价。拍卖师开始拍卖时,他观察是否有牌子举起出价。每次接受一个新的出价都改变了拍卖的当前价格,并且广播给所有的投标人进行新的出价。图2 使用拍卖例子的观察者模式第一次试验实例: 1. 观察者模式适用场景 1) 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。2) 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。1. 类图及时序图(见图1、图2) 图1.设计类图图2.时序图1. 类的实现及代码测试 1)ChicagoPizzaStore类package com.finalcom;import com.finalpizza.ChicagoStyleCheesePizza;import com.finalpizza.ChicagoStylePepperoniPizza;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类package 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;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 com.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(=); pizza=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 Pizza); 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 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)NYStyleCheesePizza类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 class 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 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.size();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 name; public void setName(String 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 void setToppings(ArrayList toppings) this.toppings = toppings;1. 2. 装饰模式(DECORATOR) 定义:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比集成更加有弹性的替代方案。类图:P91 生活中的例子: 装饰模式动态地给一个对象添加额外的职责。不论一幅画有没有画框都可以挂在墙上,但是通常都是有画框的,并且实际上是画框被挂在墙上。在挂在墙上之前,画可以被蒙上玻璃,装到框子里;这时画、玻璃和画框形成了一个物体。图2 使用有画框的画作为例子的装饰模式对象图主要解决问题 l 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加责任l 处理那些可以撤销的职责l 当不能采用生成子类的方法进行扩时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。适用性: 1.需要扩展一个类的功能,或给一个类增加附加责任。2.需要动态地给一个对象增加功能,这些功能可以再动态地撤销。3.需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。1. 3. 工厂方法模式(Factory Method)【P117去理解简单工厂模式,这里不列举】 定义:创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。类图: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 ChicagoStyleCheesePizza(); 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(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 com.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; 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 getName() return name; public void setName(String name) = name; 生活中的例子: 工厂方法定义一个用于创建对象的接口,但是让子类决定实例化哪个类。压注成型演示了这种模式。塑料玩具制造商加工塑料粉,将塑料注入到希望形状的模具中。玩具的类别(车,人物等等)是由模具决定的。适用性: 在以下情况下,适用于工厂方法模式:1.当一个类不知道它所必须创建的对象的类的时候。2.当一个类希望由它的子类来指定它所创建的对象的时候。3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候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 createPizza(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.abpizzamaterial.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类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 com.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); cheese = 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); void box() System.out.println(Place pizza in offical PizzaStore box); public String getName() return name; public void setName(String name) = name; public Cheese getCheese() return cheese; public void setCheese(Cheese cheese) this.cheese = cheese; 生活中的例子: 抽象工厂的目的是要提供一个创建一系列相关或相互依赖对象的接口,而不需要指定它们具体的类。这种模式可以汽车制造厂所使用的金属冲压设备中找到。这种冲压设备可以制造汽车车身部件。同样的机械用于冲压不同的车型的右边车门、左边车门、右前挡泥板、左前挡泥板和引擎罩等等。通过使用转轮来改变冲压盘,这个机械产生的具体类可以在三分钟内改变。适用性: 在以下情况下应当考虑使用抽象工厂模式:1) 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。2) 这个系统有多于一个的产品族,而系统只消费其中某一产品族。3) 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。4) 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。应用场景 1) 支持多种观感标准的用户界面工具箱(Kit)。2) 游戏开发中的多风格系列场景,比如道路,房屋,管道等。1. 5. 单例模式(Singleton) 定义:确保一个类仅有一个实例,并提供一个访问它的全局访问点。类图:P177 生活中的例子 美国总统的职位是Singleton,美国宪法规定了总统的选举,任期以及继任的顺序。这样,在任何时刻只能由一个现任的总统。无论现任总统的身份为何,其头衔美利坚合众国总统是访问这个职位的人的一个全局的访问点。主要解决问题: l 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时l 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用适用性: 1) 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。2) 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。3) 1. 6. 命令模式 定义:将“请求”封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。类图:P207 第三次试验: 2.模拟MP3播放器的类图(如图1)图1.模拟MP3播放器的类图3. 模拟MP3播放器的时序图(如图2)图2.模拟MP3播放器的时序图代码实现(简化部分)1. Music类 package com.zhbit.dao;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 er.Command;public 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 er.Command;public class MusicOnCommand implements Command Music 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 er.Command;public class RemoteControlWithUndo Command onCommands; Command offCommands; Command undoCommand; 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) onCommandsslot = 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(); public String toString() StringBuffer stringBuff = new StringBuffer(); stringBuff.append(n- Remote Control -n); for(int i = 0; i onCommands.length; i+) stringBuff.append(slot +i+ + onCommandsi.getClass().getName() + + offCommandsi.getClass().getName() + n); stringBuff.append(undo + undoCommand.getClass().getName() + n); return stringBuff.toString(); 1. Command接口 package er;public interface Command public void execute(); public void undo();1. RemoteLoader类 package com.zhbit.test;import com.zhbit.dao.Music;import com.zhbit.dao.MusicOffCommand;import com.zhbit.dao.MusicOnCommand;import com.zhbit.dao.RemoteControlWithUndo;public class RemoteLoder public static void main(String args) RemoteControlWithUndo remoteControl = new RemoteControlWithUndo(); Music music = new Music(忐忑); MusicOnCommand musicOn = new MusicOnCommand(music); MusicOffCommand musicOff = new MusicOffCommand(music); remoteControl.setCommand(0, musicOn, musicOff); remoteControl.onButtonWasPushed(0); remoteControl.offButtonWasPushed(0); System.out.println(remoteControl);/toString()方法打印 remoteControl.undoButtonWasPushed(); System.out.println(remoteControl); 生活中的例子 Command模式将一个请求封装为一个对象,从而使你可以使用不同的请求对客户进行参数化。用餐时的账单是Command模式的一个例子。服务员接受顾客的点单,把它记在账单上封装。这个点单被排队等待烹饪。注意这里的账单是不依赖于菜单的,它可以被不同的顾客使用,因此它可以添入不同的点单项目。适用性: 1) 使用命令模式作为CallBack在面向对象系统中的替代。CallBack讲的便是先将一个函数登记上,然后在以后调用此函数。2) 需要在不同的时间指定请求、将请求排队。一个命令对象和原先的请求发出者可以有不同的生命期。换言之,原先的请求发出者可能已经不在了,而命令对象本身仍然是活动的。这时命令的接收者可以是在本地,也可以在网络的另外一个地址。命令对象可以在串形化之后传送到另外一台机器上去。3) 系统需要支持命令的撤消(undo)。命令对象可以把状态存储起来,等到客户端需要撤销命令所产生的效果时,可以调用undo()方法,把命令所产生的效果撤销掉。命令对象还可以提供redo()方法,以供客户端在需要时,再重新实施命令效果。4) 如果一个系统要将系统中所有的数据更新到日志里,以便在系统崩溃时,可以根据日志里读回所有的数据更新命令,重新调用Execute()方法一条一条执行这些命令,从而恢复系统在崩溃前所做的数据更新。1. 7. 适配器模式 (不出综合题) 定义:将一个类的接口,转换成客户期望的另外一个接口。适配器让原来接口不兼容的类可以合作无间。类图:P243 生活中的例子 适配器模式允许将一个类的接口转换成客户期望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。扳手提供了一个适配器的例子。一个孔套在棘齿上,棘齿的每个边的尺寸是相同的。在美国典型的边长为1/2和1/4。显然,如果不使用一个适配器的话,1/2的棘齿不能适合1/4的孔。一个1/2至1/4的适配器具有一个1/2的阴槽来套上一个1/2的齿,同时有一个1/4的阳槽来卡入1/4的扳手。适用性: 1) 系统需要使用现有的类,而此类的接口不符合系统的需要。2) 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。3) (对对象适配器而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。1. 8. 外观模式 (不出综合题) 定义:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。类图:P264 生活中的例子: 外观模式为子系统中的接口定义了一个统一的更高层次的界面,以便于使用。当消费者按照目录采购时,则体现了一个外观模式。消费者拨打一个号码与客服代表联系,客服代表则扮演了这个外观,他包含了与订货部、收银部和送货部的接口。适用性 1) 为一个复杂子系统提供一个简单接口。2) 提高子系统的独立性。3) 在层次化结构中,可以使用Facade模式定义系统中每一层的入口。1. 9. 模板方法模式 定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。类图:P289 生活中的例子 模板方法定义了一个操作中算法的骨架,而将一些步骤延迟到子类中。房屋建筑师在开发新项目时会使用模板方法。一个典型的规划包括一些建筑平面图,每个平面图体现了不同部分
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山东专科考试试题及答案
- 教师个人专业的发展总结
- 饲料原料考试题及答案
- 财税理论考试题及答案
- 陕西省咸阳中学2026届化学高一第一学期期中达标检测模拟试题含解析
- 魔方挑战空间感知
- 生物标志物的临床应用
- 家电公司融资合同管理规定
- 家电公司生产计划管理办法
- 江西丰城二中2026届化学高三上期末达标测试试题含解析
- 急性中毒性肝损伤护理查房
- 静脉治疗行标理论考核试题及答案
- 2025届六年级下学期人教版小升初分班考数学试卷(含答案)
- GB/T 3836.31-2021爆炸性环境第31部分:由防粉尘点燃外壳“t”保护的设备
- CB/T 3780-1997管子吊架
- 【表格】面试评估表(模板)
- 胫骨横向骨搬移在糖尿病足治疗中的运用
- 物资供应投标书范本
- 汉译巴利三藏中部3-后五十篇
- 2011-2017国民经济行业分类标准转换对照表
- 《现代汉语》PPT课件(223页PPT)
评论
0/150
提交评论