ImageVerifierCode 换一换
格式:DOCX , 页数:32 ,大小:26.71KB ,
资源ID:9232312      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9232312.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(精通设计模式.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

精通设计模式.docx

1、精通设计模式1.设计模式的起源最早提出“设计模式”概念的是建筑设计大师亚力山大Alexander。在1970年他的建筑的永恒之道里描述了投计模式的发现,因为它已经存在了千百年之久,而现代才被通过大量的研究而被发现。在建筑的永恒之道里这样描述:模式是一条由三个部分组成的通用规则:它表示了一个特定环境、一类问题和一个解决方案之间的关系。每一个模式描述了一个不断重复发生的问题,以及该问题解决方案的核心设计。在他的另一本书建筑模式语言中提到了现在已经定义了253种模式。比如:说明城市主要的结构:亚文化区的镶嵌、分散的工作点、城市的魅力、地方交通区住宅团组:户型混合、公共性的程度、住宅团组、联排式住宅、

2、丘状住宅、老人天地室内环境和室外环境、阴和阳总是一气呵成针对住宅:夫妻的领域、儿童的领域、朝东的卧室、农家的厨房、私家的沿街露台、个人居室、起居空间的序列、多床卧室、浴室、大储藏室针对办公室、车间和公共建筑物:灵活办公空间、共同进餐、共同小组、宾至如归、等候场所、小会议室、半私密办公室尽管亚力山大的著作是针对建筑领域的,但他的观点实际上适用于所有的工程设计领域,其中也包括软件设计领域。“软件设计模式”,这个术语是在1990年代由Erich Gamma等人从建筑设计领域引入到计算机科学中来的。目前主要有23种。2.软件设计模式的分类2.1.创建型创建对象时,不再由我们直接实例化对象;而是根据特定

3、场景,由程序来确定创建对象的方式,从而保证更大的性能、更好的架构优势。创建型模式主要有简单工厂模式(并不是23种设计模式之一)、工厂方法、抽象工厂模式、单例模式、生成器模式和原型模式。2.2.结构型用于帮助将多个对象组织成更大的结构。结构型模式主要有适配器模式adapter、桥接模式bridge、组合器模式component、装饰器模式decorator、门面模式、亨元模式flyweight和代理模式proxy。2.3.行为型用于帮助系统间各对象的通信,以及如何控制复杂系统中流程。行为型模式主要有命令模式command、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式sta

4、te、策略模式、模板模式和访问者模式。3.常见设计模式介绍3.1. 单例模式(singleton)有些时候,允许自由创建某个类的实例没有意义,还可能造成系统性能下降。如果一个类始终只能创建一个实例,则这个类被称为单例类,这种模式就被称为单例模式。 一般建议单例模式的方法命名为:getInstance(),这个方法的返回类型肯定是单例类的类型了。getInstance方法可以有参数,这些参数可能是创建类实例所需要的参数,当然,大多数情况下是不需要的publicclassSingleton publicstaticvoidmain(String args)/创建Singleton对象不能通过构造器

5、,只能通过getInstance方法Singleton s1 = Singleton.getInstance();Singleton s2 = Singleton.getInstance();/将输出trueSystem.out.println(s1 = s2);/使用一个变量来缓存曾经创建的实例privatestaticSingletoninstance;/将构造器使用private修饰,隐藏该构造器privateSingleton()System.out.println(Singleton被构造!);/提供一个静态方法,用于返回Singleton实例/该方法可以加入自定义的控制,保证只产生

6、一个Singleton对象publicstaticSingleton getInstance()/如果instance为null,表明还不曾创建Singleton对象/如果instance不为null,则表明已经创建了Singleton对象,将不会执行该方法if(instance=null)/创建一个Singleton对象,并将其缓存起来instance=newSingleton();returninstance;单例模式主要有如下两个优势:1)减少创建Java实例所带来的系统开销2)便于系统跟踪单个Java实例的生命周期、实例状态等。3.2. 简单工厂(StaticFactory Metho

7、d)简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。A实例调用B实例的方法,称为A依赖于B。如果使用new关键字来创建一个B实例(硬编码耦合),然后调用B实例的方法。一旦系统需要重构:需要使用C类来代替B类时,程序不得不改写A类代码。而用工厂模式则不需要关心B对象的实现、创建过程。Output,接口publicinterfaceOutput/接口里定义的属性只能是常量intMAX_CACHE_LINE= 50;/接口里定义的只能是public的抽象实例方法voidout();voidgetData(

8、String msg);Printer,Output的一个实现/让Printer类实现OutputpublicclassPrinterimplementsOutputprivateStringprintData=newStringMAX_CACHE_LINE;/用以记录当前需打印的作业数privateintdataNum= 0;publicvoidout()/只要还有作业,继续打印while(dataNum 0) System.out.println(打印机打印:+printData0);/把作业队列整体前移一位,并将剩下的作业数减1System.arraycopy(printData, 1,

9、printData, 0, -dataNum);publicvoidgetData(String msg)if(dataNum=MAX_CACHE_LINE)System.out.println(输出队列已满,添加失败);else/把打印数据添加到队列里,已保存数据的数量加1。printDatadataNum+ = msg;BetterPrinter,Output的一个实现publicclassBetterPrinterimplementsOutputprivateStringprintData=newStringMAX_CACHE_LINE* 2;/用以记录当前需打印的作业数privatei

10、ntdataNum= 0;publicvoidout()/只要还有作业,继续打印while(dataNum 0)System.out.println(高速打印机正在打印:+printData0);/把作业队列整体前移一位,并将剩下的作业数减1System.arraycopy(printData, 1,printData, 0, -dataNum);publicvoidgetData(String msg)if(dataNum=MAX_CACHE_LINE* 2)System.out.println(输出队列已满,添加失败);else/把打印数据添加到队列里,已保存数据的数量加1。printDa

11、tadataNum+ = msg;OutputFactory,简单工厂类publicOutput getPrinterOutput(String type) if(type.equalsIgnoreCase(better) returnnewBetterPrinter();elsereturnnewPrinter();ComputerpublicclassComputerprivateOutputout;publicComputer(Output out)this.out= out;/定义一个模拟获取字符串输入的方法publicvoidkeyIn(String msg)out.getData(

12、msg);/定义一个模拟打印的方法publicvoidprint()out.out();publicstaticvoidmain(String args)/创建OutputFactoryOutputFactory of =newOutputFactory();/将Output对象传入,创建Computer对象Computer c =newComputer(of.getPrinterOutput(normal);c.keyIn(建筑永恒之道);c.keyIn(建筑模式语言);c.print();c =newComputer(of.getPrinterOutput(better);c.keyIn(

13、建筑永恒之道);c.keyIn(建筑模式语言);c.print();使用简单工厂模式的优势:让对象的调用者和对象创建过程分离,当对象调用者需要对象时,直接向工厂请求即可。从而避免了对象的调用者与对象的实现类以硬编码方式耦合,以提高系统的可维护性、可扩展性。工厂模式也有一个小小的缺陷:当产品修改时,工厂类也要做相应的修改。3.3. 工厂方法(Factory Method)和抽象工厂(Abstract Factory)如果我们不想在工厂类中进行逻辑判断,程序可以为不同产品类提供不同的工厂,不同的工厂类和产不同的产品。当使用工厂方法设计模式时,对象调用者需要与具体的工厂类耦合,如:/工厂类的定义1p

14、ublicclassBetterPrinterFactoryimplementsOutputFactorypublicOutput getOutput()/该工厂只负责产生BetterPrinter对象returnnewBetterPrinter();/工厂类的定义2publicclassPrinterFactoryimplementsOutputFactorypublicOutput getOutput()/该工厂只负责产生Printer对象returnnewPrinter();/工厂类的调用/OutputFactory of = new BetterPrinterFactory();Out

15、putFactory of =newPrinterFactory();Computerc =newComputer(of.getOutput();使用简单工厂类,需要在工厂类里做逻辑判断。而工厂类虽然不用在工厂类做判断。但是带来了另一种耦合:客户端代码与不同的工厂类耦合。为了解决客户端代码与不同工厂类耦合的问题。在工厂类的基础上再增加一个工厂类,该工厂类不制造具体的被调用对象,而是制造不同工厂对象。如:/抽象工厂类的定义,在工厂类的基础上再建一个工厂类publicclassOutputFactoryFactory/仅定义一个方法用于返回输出设备。publicstaticOutputFactor

16、y getOutputFactory(String type)if(type.equalsIgnoreCase(better)returnnewBetterPrinterFactory();elsereturnnewPrinterFactory();/抽象工厂类的调用OutputFactory of = OutputFactoryFactory.getOutputFactory(better);Computer c =newComputer(of.getOutput();3.4. 代理模式(Proxy)代理模式是一种应用非常广泛的设计模式,当客户端代码需要调用某个对象时,客户端实际上不关心是否

17、准确得到该对象,它只要一个能提供该功能的对象即可,此时我们就可返回该对象的代理(Proxy)。代理就是一个Java对象代表另一个Java对象来采取行动。如:publicclassImageProxyimplementsImage/组合一个image实例,作为被代理的对象privateImageimage;/使用抽象实体来初始化代理对象publicImageProxy(Image image)this.image= image;/*重写Image接口的show()方法*该方法用于控制对被代理对象的访问,*并根据需要负责创建和删除被代理对象*/publicvoidshow()/只有当真正需要调用i

18、mage的show方法时才创建被代理对象if(image=null)image=newBigImage();image.show();调用时,先不创建:Image image = new ImageProxy(null);hibernate默认启用延迟加载,当系统加载A实体时,A实体关联的B实体并未被加载出来,A实体所关联的B实体全部是代理对象只有等到A实体真正需要访问B实体时,系统才会去数据库里抓取B实体所对应的记录。借助于Java提供的Proxy和InvocationHandler,可以实现在运行时生成动态代理的功能,而动态代理对象就可以作为目标对象使用,而且增强了目标对象的功能。如:Pa

19、ntherpublicinterfacePanther/info方法声明publicvoidinfo();/run方法声明publicvoidrun();GunPantherpublicclassGunPantherimplementsPanther/info方法实现,仅仅打印一个字符串publicvoidinfo()System.out.println(我是一只猎豹!);/run方法实现,仅仅打印一个字符串publicvoidrun()System.out.println(我奔跑迅速);MyProxyFactory,创建代理对象publicclassMyProxyFactory/为指定tar

20、get生成动态代理对象publicstaticObject getProxy(Object target)throwsException/创建一个MyInvokationHandler对象MyInvokationHandler handler =newMyInvokationHandler();/为MyInvokationHandler设置target对象handler.setTarget(target);/创建、并返回一个动态代理returnProxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass()

21、.getInterfaces(), handler);MyInvokationHandler,增强代理的功能publicclassMyInvokationHandlerimplementsInvocationHandler/需要被代理的对象privateObjecttarget;publicvoidsetTarget(Object target)this.target= target;/执行动态代理对象的所有方法时,都会被替换成执行如下的invoke方法publicObject invoke(Object proxy, Method method, Object args)throwsExce

22、ptionTxUtil tx =newTxUtil();/执行TxUtil对象中的beginTx。tx.beginTx();/以target作为主调来执行method方法Object result = method.invoke(target, args);/执行TxUtil对象中的endTx。tx.endTx();returnresult;TxUtilpublicclassTxUtil/第一个拦截器方法:模拟事务开始publicvoidbeginTx()System.out.println(=模拟开始事务=);/第二个拦截器方法:模拟事务结束publicvoidendTx()System.o

23、ut.println(=模拟结束事务=);测试publicstaticvoidmain(String args)throwsException/创建一个原始的GunDog对象,作为targetPanther target =newGunPanther();/以指定的target来创建动态代理Panther panther = (Panther)MyProxyFactory.getProxy(target);/调用代理对象的info()和run()方法panther.info();panther.run();spring所创建的AOP代理就是这种动态代理。但是Spring AOP更灵活。3.5.

24、 命令模式(Command)某个方法需要完成某一个功能,完成这个功能的大部分步骤已经确定了,但可能有少量具体步骤无法确定,必须等到执行该方法时才可以确定。(在某些编程语言如Ruby、Perl里,允许传入一个代码块作为参数。但Jara暂时还不支持代码块作为参数)。在Java中,传入该方法的是一个对象,该对象通常是某个接口的匿名实现类的实例,该接口通常被称为命令接口,这种设计方式也被称为命令模式。如:CommandpublicinterfaceCommand/接口里定义的process方法用于封装“处理行为”voidprocess(int target);ProcessArraypublicclassProcessArray/定义一个each()方法,用于处理数组,publicvoideach(int target , Commandcmd)cmd.process(target);TestCommandpublicclassTestCommandpublicstaticv

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1