Java3种模式带例子解读_第1页
Java3种模式带例子解读_第2页
Java3种模式带例子解读_第3页
Java3种模式带例子解读_第4页
Java3种模式带例子解读_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、HINGXIA UN1VCRS1I中间件技术原理与应用Java设计模式学院数学计算机学院专业年 级 2011级学生学号 12011242707学生姓名苏发瑞Java设计模式目录1.设计模式21.1创建型模式 21.1.1原型模式21.2结构型模式41.2.1组合模式51.3行为型模式 91.3.1备忘录模式 111Java设计模式1.设计模式1.1创建型模式AbstractFactory (抽象工厂) FactoryMethod (工厂方法) Singleton ( 单态模式 ) Builder (建造者模式) Protot*pe * 原型模式 )1.1.1原型模式用原型实例指定创建对象的种类

2、,并且通过拷贝这些原型创建新的对象。 适用性1. 当一个系统应该独立于它的产品创*、构成和表示时。2. 当要实例化的类是在运行时刻指定时,例如,通过动态装载。3. 为了避免创建一个与产品类层次平行的工厂 *层次时。4. 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更 方便一些。匚I参与者1. Prototype声明一个克隆自身的接口。2. Con cretePrototype实现一个克隆自身的操作。3. Clie nt让一个原型克*自身从而创建一个新的对象。口类图例子Prototypepublic class Prototyp

3、e impleme nts Cion eable private String n ame;public void setName(Stri ng n ame) this .n ame = n ame;public Stri ng getName() return this. name;public Object cion e()try retur n super.cl on e(); catch (Exceptio n e) e.pri ntStackTrace();return nu II;ConcretePrototypepubl*c class Con cretePrototype e

4、xte nd* Prototype public Con cretePrototype(Stri ng n ame) setName( name);Clientpublic clas* Test public static void main( Stri ng args) Prototype pro = new Con cretePrototy*e("prototype");Prototype pro2 = (Prototype)pro.cl on e();*ystem.out.pri ntl n(pro.getName()*;System.out.pri ntl n(pr

5、o2.getName();resultprototypeprototype小结:原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型 对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类 不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一 个类都必须配备一个克隆方法。例如:(1)QQ聊天,另叽向我们打招呼,我们点个托管,设置对面内容,然后就自动回复了。( 2)设立原始尺寸,然后就可以根据原型复制更多的出来,代码如下:package totype;/原型interface P

6、rototype void setSize( int x);void printSize();/ 一个具体类class Aimplements Prototype, Cloneable privateint size;public A( int x) this .size = x;Overridepublicvoid setSize( int x) this .size = x;Overridepublicvoid printSize() System.out.println("Size: "+ size);Overridepublic A clone() throws C

7、loneNotSupportedException return (A) super .clone();/需要很多类似的对象进行测试publicclass PrototypeTest publicstaticvoidmain(String args)throws CloneNotSupportedException A a = new A( 1);for (int i = 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组合模式将对象组合成树形结构以表示"部分-整体"的层次结构o "Composite使得用户 对单个对象和组合对*的使用具有一致性。"适用性1. 你想表示对象的部分-整*层次结构2. 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构 中的所有对象。 参与者1. Comp onent为组合中的对象声明接口 在适当的情况下,实现所有类共有接口的缺省行为。声明一个接口用于

9、访问和管理Comp on e nt的子组件。( 可选)在递归结构中定义一个接口,用于访问一个父部件,并在合 *的情况 下实现它。2. Leaf在组合中表示叶节点对象,叶节点没有子节点。 在组合中定义节点对象的行为。3. Compos*te定义有子部件的*些部件的行为。 存储子部件。在Component接口中实现与子部件有*的操作。4. Clie nt通过Component接*操纵组合部件的对象。口类图例子Componentp*blic abstract class Employer private String n ame;public void setName(Stri ng n ame)

10、this .n ame = *ame;public Stri ng getName() return this. name;public abstract void add(Employer employer*;public abstract void delete(Employer employer);public List employers;public void printin fo*) System.out.pri ntln(n ame);*ublic List getE*ployers() return this.employers;Leafpublic class Program

11、mer exte nds Employer public Programmer(Stri ng n ame) setNam* (n ame);employers = null;程序员,表示没有下属了public v*id add(Employer employer) public void delete(Employer employer) public class Pro*ectAssista nt exte nds Employer public ProjectAss*sta nt(Stri ng n ame) setName( name);employers = *ull;项目助理,表示

12、没有下属了public void add(Employer employer) public void delet*(Employer employer) Compositepublic class Project*a nager exte nds E*ployer public ProjectMa nager(Stri ng n ame) setName( name);employers = new A*rayList();public void add(Employer employer) employers.add(employer);public void delete(Emplo*e

13、r employer) employers.remove(employer);Clie*tpubl*c class Test public st*tic void main( Stri ng args) Employer pm = new ProjectManager(”项目经理");Emplo*er pa = new ProjectAssistant(”项目助理");Employer progra*mer1 = new Programmer("程序员一");Employer programmer2 = new Programmer("程序员二

14、");pm.add(pa);/为项目经理添加项目助理pm.add(programmer2);*项目经理*加程序员List ems = pm.getEm*loyers();for (Employer em : ems) System.out.pri ntl n(em.getNam*();*result项目助理 程序员二 小结: 合成模式:合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式就 是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模 式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。例如:(1)Mary过完轮到

15、Sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩 完,拿出我去年在华山顶上照的照片,在背面写上“最好的的礼物,就是爱你的Fita”,再到街上礼品店买了个像框(卖礼品的 MM也很漂亮哦),再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来,我们都是Decorator,最终都在修饰我这个人呀,怎么样,看懂了吗?(2) 一美女,穿件时髦衣裳,留着时髦发型,带着金银首饰,脚踏着华丽的靴子,这样一装 扮,就更加漂亮了。(3 )可以通过一个统一的接口将文件和文件夹统一起来,对用户提供一致的操作,屏蔽不同 的复制实现过程。我们在复制文件夹的时候,操作系统实现了对文件夹内的所有文件和文件 夹

16、的复制,即实现了组合对象的整体复制,而不是一个空的文件夹;这和我们复制单个文件 的体验是一致的。这便是组合模式的妙处。完整的模拟代码如下:1 package com.csufox.Composite;2import java.util.ArrayList;45 in terface Node6 public void copy(); /定义统一的接口:复制S- class Folder impleme nts Node 1 private String folderName;.1.1 private ArrayList nodeList =n ew ArrayList(); /用于存储文件夹下

17、的文件夹或文件的信息12二 public Folder(Stri ng folderName) J this.folderName = folderName;16ipublic void add(Node node) /增加文件或文件夹iMno deList.add( no de);二2D21 public void copy() II文件夹复制操作实现递归空System.out.pri ntln(”复制文件夹:” + folderName);for(i nt i=0;i24Node n ode = (Node) nodeList.get(i);25no de.copy();262728293

18、0class File impleme nts Node31private String fileName;3233public File(String fileName)34this.fileName = fileName;353637public void copy()3SSystem.out.pri ntl n("复制文件:"+ fileName);血 i- 41工.public class Composite4: public static void main( Stri ng args)44Folder document = new Folder("我的

19、资料");/我的资料文件夹讣File book = new File("Java编程思想.pdf'); / 文档文件Folder music = new Folder("我的音乐");/ 我的音乐文件夹工:File musicl = new File("你是我的眼.mp3"); / 音乐文件 1驱File music2 = new File("Without You.mp3"); /音乐文件 2电;:/确定树形结构关系">document.add(book);:|document.add(m

20、usic);、二music.add(musicl);Xmusic.add(music2);54docume nt.copy(); /复制"我的资料”文件夹,递归地复制了其下所有文件夹和文件。、 运行结果如下:小复制文件夹:我的资料、':复制文件:Java编程思想.pdf辽复制文件夹:我的音乐61复制文件:你是我的眼.mp3复制文件:Without You.mp31.3行为型模式Chain of Responsibility (责任链模式 )Command ( 命令模式 )Interpreter (解释器模式)Iterator (迭代器*式)Mediator (中介者模式 )M

21、emento ( 备忘录模式 )Observer (观察者模式)State (状*模式)Strategy (策略模式)TemplateMethod (模板方法)Vis*tor (访问者模式)1.3.1备忘录模式在不破坏封装性*前提下,捕获一个对象的内部状态,并在该对象之外保存这 个状态。这样以后就可将该对象恢复到原先保存的状态。适用性1. 必须*存一个对象在某一个时刻的(部分)状态,这样以后需要时它才能恢复 到先前的状态。2. 如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细 节并破坏对象的封装性。参与者1.Meme nto备忘录存储原发器对象的内部状态。2.Origi nat

22、or原发器创建一个备忘录,用以记录当前时刻*的内部状态。使用备忘录恢复内部状态3. Caretaker负责保存好备忘录。不能对备忘录的内*进行操作或检查。类图例子Mementopublic class Meme nto private Stri ng state;public Meme*to(Stri ng state) this.state = state;public String getState() *eturn state;public void setSt*te(Stri ng state) this.stat* = s*ate;Or*ginatorpublic class Ori

23、gin ator private Stri ng state;public Stri ng getState() return state;public void setState(Stri ng state) this.state = state;*ublic Meme nto createMeme nto() return new Meme nto(state);p*blic void setMeme nto(Meme nto meme*to) state = meme nto.ge*State();p*blic void showState() System.out.pri ntln(

24、state);Caretakerpublic class Caretaker p*ivate Meme nto meme nto;public Meme nto getMeme nto() return this.meme nto;public void setMeme nto(Meme nto meme nto) this.meme nto = meme nto;Testpublic class Test public static void main( Stri ng args) Origin ator org = *ew Origi nator(); org*setState("

25、; 开会中");C*retaker ctk = new Ca*etaker();ctk.setMemento(org.createMemento();将数据圭寸装在 Caretakeror*.setState("睡觉中");org.sh*wState();*/显示org.setMeme nto(ctk.getMeme nto();将数据重新导入or*.showState();result睡觉中开会中小结:备忘录模式:备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可 以

26、在将来合适的时候把这个对象还原到存储起来的状态。例如: (1 )同时跟几个网友聊天时,一定要记清楚刚才跟网友说了些什么话,不然MM发现了会不高兴的哦,幸亏我有个备忘录,刚才与哪个网友说了什么话我都拷贝一份放到备忘录里面保存,这样可以随时察 看以前的记录啦。(2) 计算机设置还原点,当需要进行还原系统是就能一键还原了(3) 如果一个对象需要保存状态并可通过undo或rollback等操作恢复到以前的状态时,可以使用Memento模式。1) 一个类需要保存它的对象的状态(相当于 Originator角色)2) 设计一个类,该类只是用来保存上述对象的状态(相当于 Memento角色)3) 需要的时候

27、,Caretaker角色要求 Originator返回一个 Memento并加以保存4) undo或rollback操作时,通过 Caretaker保存的 Memento恢复Originator对象的状态Memento模式比较简单,我们只需要按照上面所介绍的步骤就可以实现Memento模式。例子代码如下:public in terface Meme ntolF / 保存 Mementopublic class Caretaker private Meme ntolF m;public void saveMeme nto(Meme ntolF m) this.m = m;public Meme ntolF getMeme nto() return m;public class Origin ator /这是要保存的状态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

提交评论