版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、中间件技术原理与应用课程Java设计模式学 院 数学计算机学院 专 业 软件工程 年 级 2011级 学生学号 12011242707 学生姓名 苏发瑞 Java设计模式目录1. 设计模式21.1 创建型模式21.1.1 原型模式21.2 结构型模式41.2.1 组合模式51.3 行为型模式91.3.1 备忘录模式11141. 设计模式1.1 创建型模式AbstractFactory ( 抽象工厂 ) FactoryMethod ( 工厂方法 ) Singleton ( 单态模式 ) Builder ( 建造者模式 ) Protot*pe * 原型模式 ) 1.1.1 原型模式 用原型实例指定
2、创建对象的种类,并且通过拷贝这些原型创建新的对象。 适用性 1.当一个系统应该独立于它的产品创*、构成和表示时。 2.当要实例化的类是在运行时刻指定时,例如,通过动态装载。 3.为了避免创建一个与产品类层次平行的工厂*层次时。 4.当一个类的实例只能有几个不同状态组合中的一种时。 建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。 参与者 1. Prototype 声明一个克隆自身的接口。 2. ConcretePrototype 实现一个克隆自身的操作。 3. Client 让一个原型克*自身从而创建一个新的对象。 类图 例子
3、Prototype public class Prototype implements Cloneable private String name; public void setName(String name) = name; public String getName() return ; public Object clone() try return super.clone(); catch (Exception e) e.printStackTrace(); return null; ConcretePrototype publ*c class
4、 ConcretePrototype extend* Prototype public ConcretePrototype(String name) setName(name); Client public clas* Test public static void main(String args) Prototype pro = new ConcretePrototy*e("prototype"); Prototype pro2 = (Prototype)pro.clone(); *ystem.out.println(pro.getName()*; System.out
5、.println(pro2.getName(); result prototypeprototype小结:原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。例如:(1)QQ聊天,别人向我们打招呼,我们点个托管,设置对面内容,然后就自动回复了。(2)设立原始尺寸,然后就可以根据原型复制更多的出来,代码如下:totype; /原型in
6、terfacePrototype voidsetSize(intx); voidprintSize(); / 一个具体类classAimplementsPrototype, Cloneable privateintsize; publicA(intx) this.size = x; Override publicvoidsetSize(intx) this.size = x; Override publicvoidprintSize() System.out.println("Size: "+ size); Override publicA clone()throwsClo
7、neNotSupportedException return(A)super.clone(); /需要很多类似的对象进行测试publicclassPrototypeTest publicstaticvoidmain(String args)throwsCloneNotSupportedException A a =newA(1); for(inti =2; i <10; i+) Prototype temp = a.clone(); temp.setSize(i); temp.printSize(); 1.2 结构型模式Adapter * 适配器模式 * Bridge ( 桥接模* )
8、Composite ( 组合模式 ) Decorator ( 装*模式 ) Facade ( 外观模式 ) Flyweight ( 享元模式 ) Proxy ( 代理模式 ) 1.2.1 组合模式 将对象组合成树形结构以表示"部分-整体"的层次结构。"Composite使得用户对单个对象和组合对*的使用具有一致性。" 适用性 1.你想表示对象的部分-整*层次结构。 2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。 参与者 1.Component 为组合中的对象声明接口。 在适当的情况下,实现所有类共有
9、接口的缺省行为。 声明一个接口用于访问和管理Component的子组件。 (可选)在递归结构中定义一个接口,用于访问一个父部件,并在合*的情况下实现它。 2.Leaf 在组合中表示叶节点对象,叶节点没有子节点。 在组合中定义节点对象的行为。 3.Compos*te 定义有子部件的*些部件的行为。 存储子部件。 在Component接口中实现与子部件有*的操作。 4.Client 通过Component接*操纵组合部件的对象。 类图 例子Component p*blic abstract class Employer private String name; public v
10、oid setName(String name) = *ame; public String getName() return ; public abstract void add(Employer employer*; public abstract void delete(Employer employer); public List employers; public void printInfo*) System.out.println(name); *ublic List getE*ployers() return this.employers;
11、 Leaf public class Programmer extends Employer public Programmer(String name) setNam*(name); employers = null;/程序员, 表示没有下属了 public v*id add(Employer employer) public void delete(Employer employer) public class Pro*ectAssistant extends Employer public ProjectAss*stant(String name) setName(name); empl
12、oyers = *ull;/项目助理, 表示没有下属了 public void add(Employer employer) public void delet*(Employer employer) Composite public class Project*anager extends E*ployer public ProjectManager(String name) setName(name); employers = new A*rayList(); public void add(Employer employer) employers.add(employer); publi
13、c void delete(Emplo*er employer) employers.remove(employer); Clie*t publ*c class Test public st*tic void main(String args) Employer pm = new ProjectManager("项目经理"); Emplo*er pa = new ProjectAssistant("项目助理"); Employer progra*mer1 = new Programmer("程序员一"); Employer progr
14、ammer2 = new Programmer("程序员二"); pm.add(pa);/为项目经理添加项目助理 pm.add(programmer2);/*项目经理*加程序员 List ems = pm.getEm*loyers(); for (Employer em : ems) System.out.println(em.getNam*(); *result 项目助理程序员二小结:合成模式:合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分
15、对象和由他们复合而成的合成对象同等看待。例如:(1)Mary过完轮到Sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片,在背面写上“最好的的礼物,就是爱你的Fita”,再到街上礼品店买了个像框(卖礼品的MM也很漂亮哦),再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来,我们都是Decorator,最终都在修饰我这个人呀,怎么样,看懂了吗?(2) 一美女,穿件时髦衣裳,留着时髦发型,带着金银首饰,脚踏着华丽的靴子,这样一装扮,就更加漂亮了。(3)可以通过一个统一的接口将文件和文件夹统一起来,对用户提供一致的操作,屏蔽不同的复制实现过程。我们在复制
16、文件夹的时候,操作系统实现了对文件夹内的所有文件和文件夹的复制,即实现了组合对象的整体复制,而不是一个空的文件夹;这和我们复制单个文件的体验是一致的。这便是组合模式的妙处。完整的模拟代码如下:1 package com.csufox.Composite; 2 3 import java.util.ArrayList; 4 5 interface Node 6 public void copy(); /定义统一的接口:复制 7 8 9 class Folder implements Node 10 private String folderName; 11 private ArrayList n
17、odeList =new ArrayList(); /用于存储文件夹下的文件夹或文件的信息 12 13 public Folder(String folderName) 14 this.folderName = folderName; 15 16 17 public void add(Node node) /增加文件或文件夹 18 nodeList.add(node); 19 20 21 public void copy() /文件夹复制操作实现递归 22 System.out.println("复制文件夹:" + folderName); 23 for(int i=0;i
18、24 Node node = (Node)nodeList.get(i); 25 node.copy(); 26 27 28 29 30 class File implements Node 31 private String fileName; 32 33 public File(String fileName) 34 this.fileName = fileName; 35 36 37 public void copy() 38 System.out.println("复制文件:" + fileName); 39 40 41 42 public class Compos
19、ite 43 public static void main(String args) 44 Folder document = new Folder("我的资料"); /我的资料文件夹 45 File book = new File("Java编程思想.pdf"); /文档文件 46 Folder music = new Folder("我的音乐"); /我的音乐文件夹 47 File music1 = new File("你是我的眼.mp3"); /音乐文件1 48 File music2 = new File
20、("Without You.mp3"); /音乐文件2 49 /确定树形结构关系 50 document.add(book); 51 document.add(music); 52 music.add(music1); 53 music.add(music2); 54 55 document.copy(); /复制“我的资料”文件夹,递归地复制了其下所有文件夹和文件。 56 57 运行结果如下:58 复制文件夹:我的资料 59 复制文件:Java编程思想.pdf 60 复制文件夹:我的音乐 61 复制文件:你是我的眼.mp3 复制文件:Without You.mp31.3
21、行为型模式Chain of Responsibility ( 责任链模式 ) Command ( 命令模式 ) Interpreter ( 解释器模式 ) Iterator ( 迭代器*式 ) Mediator ( 中介者模式 ) Memento ( 备忘录模式 ) Observer ( 观察者模式 ) State ( 状*模式 ) Strategy ( 策略模式 ) TemplateMethod ( 模板方法 ) Vis*tor ( 访问者模式 ) 1.3.1 备忘录模式 在不破坏封装性*前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。&
22、#160;适用性 1.必须*存一个对象在某一个时刻的(部分)状态,这样以后需要时它才能恢复到先前的状态。 2.如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。 参与者 1.Memento 备忘录存储原发器对象的内部状态。 2.Originator 原发器创建一个备忘录,用以记录当前时刻*的内部状态。 使用备忘录恢复内部状态. 3.Caretaker 负责保存好备忘录。 不能对备忘录的内*进行操作或检查。 类图 例子Memento public class Memento private String state; public
23、 Meme*to(String state) this.state = state; public String getState() *eturn state; public void setSt*te(String state) this.stat* = s*ate; Or*ginator public class Originator private String state; public String getState() return state; public void setState(String state) this.state = state; *ublic Memen
24、to createMemento() return new Memento(state); p*blic void setMemento(Memento meme*to) state = memento.ge*State(); p*blic void showState() System.out.println(state); Caretaker public class Caretaker p*ivate Memento memento; public Memento getMemento() return this.memento; public void setMemento(Memen
25、to memento) this.memento = memento; Test public class Test public static void main(String args) Originator org = *ew Originator(); org*setState("开会中"); C*retaker ctk = new Ca*etaker(); ctk.setMemento(org.createMemento();/将数据封装在Caretaker or*.setState("睡觉中"); org.sh*wState();*/显示 o
26、rg.setMemento(ctk.getMemento();/将数据重新导入 or*.showState(); result 睡觉中开会中小结: 备忘录模式:备忘录对象是一个用来存储另外一个对象内部状态的快照 的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。例如: (1)同时跟几个网友聊天时,一定要记清楚刚才跟网友说了些什么话,不然MM发现了会不高兴的哦,幸亏我有个备忘录,刚才与哪个网友说了什么话我都拷贝一份放到备忘录里面保存,这样可以随时察看以前的记录啦。(2) 计算机设置还原点,当需要进行还
27、原系统是就能一键还原了.(3)如果一个对象需要保存状态并可通过undo或rollback等操作恢复到以前的状态时,可以使用Memento模式。1)一个类需要保存它的对象的状态(相当于Originator角色)2)设计一个类,该类只是用来保存上述对象的状态(相当于Memento角色)3)需要的时候,Caretaker角色要求Originator返回一个Memento并加以保存4)undo或rollback操作时,通过Caretaker保存的Memento恢复Originator对象的状态Memento模式比较简单,我们只需要按照上面所介绍的步骤就可以实现Memento模式。例子代码如下:public interface MementoIF / 保存Mementopublic class Caretaker private MementoIF m;public void saveMemento(MementoIF m) this.m = m;public MementoIF getMemento() return m;public class Originator / 这是要保存的状态private int state = 90;private Caretaker c = new Caretaker(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论