23种设计模式详解 (2).ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《23种设计模式详解 (2).ppt》由会员分享,可在线阅读,更多相关《23种设计模式详解 (2).ppt(80页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、设计模式详解何谓设计模式 在面向对象程序设计(OOP)过程中,我们经常会遇到很多重复出现的问题,总结解决这些问题的成功经验和最佳实践便形成了设计模式(Design Pattern)。其核心思想是将可重用的解决方案总结出来,并分门别类。从而指导设计,减少代码重复和优化体系结构。采用设计模式的益处重用,避免代码重复冗余优化体系结构提升系统的可维护性和弹性代码更加容易测试,利于测试驱动为性能优化提供便利使软件质量更加有保证增强代码可读性,便于团队交流有助于整体提升团队水平设计模式、重构和Antiparttern设计模式是成功经验和最佳实践的总结,指导设计人员采用正确精良的设计。重构(Refactor
2、)专注于软件的渐进完善。通过消除重复冗余代码,并将存在体系结构缺陷的代码重新构建成符合设计模式的代码来达到设计精良软件的目的。Antiparttern与设计模式相反,是失败教训的总结。其澄清了许多设计中经常面临的陷阱和容易混淆的问题,能有效防止开发人员犯错误,从而做出正确选择。设计模式与UML 设计模式是OOP的方法论,其内容描述基本是围绕对象的结构和协作关系设计。因此需要一种直观的模型将上述内容清晰地表示出来。统一建模语言(UML)是OOP的建模语言,其核心就是把软件的设计思想通过建模的方法表达出来。故非常适合于表达设计模式。同时UML已经被广泛用于软件设计,这也推动了设计模式的应用。设计模
3、式分类Creational patterns 帮助我们更好地组织创建对象的代码。增强弹性,以应付在不同情况下创建和初始化对象的代码变更。Structural patterns 增强代码重用,优化对象结构,使其职责分明、粒度合适,以松耦合的体系结构来减低代码的rippling效应。Behavioral patterns 更好地定义对象间的协作关系,使复杂的程序流程变得清晰。Creational PatternsThe Factory PatternThe Abstract Factory PatternThe Singleton PatternThe Prototype PatternThe F
4、actory Pattern Factory是最常见的设计模式之一,可帮助我们组织创建对象的代码,通常用于以下两种情况:v 创建复杂的对象,并进行初始化。v 根据不同的环境(输入参数),创建不同用途的对象。一般这些对象都是实现了相同的接口或继承于同一基类。Factory模式的JDBC应用OracleDataSource负责创建链接,由函数getConnection获取链接Factory模式应用于DAO XMLDB是XML数据库访问接口,针对Oracle和DB2分别提供了实现。XMLDB_DAOFactory为类工厂,根据输入的参数dbtype,创建不同的XMLDB实现类。更多的Factory模
5、式应用例子 Hibernate的SessionFactory,将数据库表和对象的映射关系写入XML格式的配置文件,然后由SessionFactory根据它来创建Session。EJB容器本身就是一个EJB的Factory。当客户端调用EJB的时候,由容器创建EJB供其使用。The Abstract Factory Pattern 在介绍Abstract Factory之前,先回顾下Factory模式的JDBC应用。由于很多系统需要访问不同的数据库,故在得到Connection之前要获取不同的DataSource。于是我们又遇到了Factory模式所要解决的问题:创建一个Factory来获取不同
6、的DataSource。而DataSource本身又是一个Factory。由上述我们不难引出Abstract Factory的定义,就是用于创建Factory的Factory。其设计思想和Factory的完全一致,不过是一种特殊的Factory而已。Abstract Factory的EJB应用 EJB容器需要支持多种数据库,每种不同的数据库有相应的DataSource。因此容器先根据部署文件里面的设置,创建各个DataSource,然后绑定到其目录服务中。使用DataSource的时候只要从目录服务中获取即可,故其充当了DataSource的Abstract Factory。实际上,EJB容器
7、将所有资源(JMS Factory、EJB Home等)的Factory全绑定到了目录服务中,使用这些Factory的时候都是由目录服务获取,因此目录服务是所有资源Factory的Abstract Factory。The Singleton Pattern Singleton模式应用在系统中的某些对象有且只能有一个实例的情况下,也就是确保类只能实例化一次。很多类都是Singleton,例如Java语言里的System、Runtime和Math类,JDBC中的DriverManager等。Singleton模式的实现利用Static Classes来实现。如Java语言中的System和Math
8、类。结合Factory模式实现。由于Factory负责对象的创建,在其中实现Singleton更优雅且具弹性。此外,因多数Factory都要求只有一个实例,Abstract Factory的实现广泛采用了Singleton模式。The Prototype Pattern 当创建对象非常耗费资源且复杂的时候,为避免重复对象的创建过程,而采用复制已有对象的副本(或重用已有对象)再作适当更改的方法来加快其创建速度。这便是Prototype模式。J2EE环境中,多数昂贵资源的创建都通过采用实例缓冲技术来实现Prototype模式。典型例子为JDBC的链接缓冲池。Prototype模式的应用 Proto
9、type模式对于昂贵的资源来说是非常有价值的,在J2EE环境里面得到广泛的应用。其实现多数是以实例缓冲的形式出现,且有不少开源项目专注与相关类库的开发。与Singleton模式类似,Prototype模式多数是结合Factory使用。如容器中的DataSource就具备链接缓冲的功能。小节Factory模式用于屏蔽对象的创建逻辑,根据输入的数据从相似的类中选择和返回相应类的实例。Abstract Factory模式是用于产生Factory的Factory。Singleton模式可确保系统中的某些类有且只有一个实例,并使其能全局访问。Prototype模式运用在创建新对象代价过高的环境下,通过重
10、用已有对象达到节省资源和提高性能的目的。Structural PatternsThe Adapter PatternThe Composite PatternThe Decorator PatternThe Facade PatternThe Proxy PatternThe Adapter Pattern Adapter模式用于转换类的编程接口,将编程接口不同而功能相似的类用一个统一的接口封装起来。顾名思义,Adapter就是起到一个中转桥梁的作用。其思想也很简单,编写一个实现了统一接口的类,由其与编程接口相异的类打交道,从而达到屏蔽类编程细节的目的。Adapter模式的实现Adapter模
11、式的实现方案通常有两种:类继承 以需要适配的类为基础,派生一个子类,然后在子类中添加新的函数,实现制订的统一接口。类联合 创建一个新的类,其中包含需要适配的类。然后给新类添加函数,实现制订的统一接口。Adapter模式实现和应用举例举一个简单的例子来说明Adapter的应用和实现。下面看到的是一个简单的Java程序,将左边列表中的字符串移到右边,或者反之。开始程序是用AWT类库实现的,而后来我们要将其改为JFC,因两个类库的功能类似,但是调用接口差异大,所以引入Adapter模式,避免变更波及整个程序。示例附图函数变更AWT List classadd(String)remove(String
12、)String getSelectedItems()JFC JList classObject getSelectedValues()The Composite Pattern编程中往往会遇到一个组件既可仅为一个单独的对象,也可用对象集合来表示的情况。这便是Composite模式的用武之地。典型的案例是树型结构数据,每个节点既可包含多个子节点,也可能是叶子节点。且各个节点一般是不同的类。为了将所有节点组织起来,从所有节点类中抽象出能表示其共性和树型结构的接口,这便是Composite。Composite模式举例 以上为公司所有职位的结构图,每个员工可能有其下属,也包含了姓名和工资等共有的信息。
13、如何将类组织起来,使其既能表达树型结构的组织关系,又可以表示出员工的共有信息,是Composite模式要解决的问题。Composite模式示例的实现综合树型结构表示所需函数以及员工的共有信息可以提取出以下抽象类(或接口):public abstract class Employee public float getSalary().public String getName().public float getSalaries().public abstract int getTypeCode();public abstract boolean isLeaf();public boolean
14、add(Employee e).public void remove(Employee e).public Employee getChild(String s).public Enumeration elements().抽象类Employee的add、remove、getChild和elements体现了树型数据结构的基本操作,其它的属性为员工的共有信息。然后以之为基类,根据员工的职能派生出具体的实现类。Composite模式应用于DOMXML数据同样也可看成是树型结构,因此XML解释器将其由字符串转换成一种树型模型DOM。然后就可以基于DOM对XML进行数据提取、遍历及各种编辑操作。DO
15、M是W3C制订的标准,完全基于Composite模式。其中所有节点都用Node接口表示,然后由其派生出Element,Text和Attribute等接口。DOM应用图例public interface Node public String getNodeName();public short getNodeType();public String getPrefix();.public Node getParentNode();public boolean hasChildNodes();public NodeList getChildNodes();public Node appendChi
16、ld(Node newChild);public Node removeChild(Node oldChild);public Node insertBefore(Node newChild,Node refChild);.The Decorator PatternDecorator模式为我们提供了一种无需创建派生类就能改变对象行为的方法。某个对象需要改变行为,添加附加的特性,多数情况下采用类继承是能够解决。比如当其需要三种不同的附加特性,可以为其创建三个派生类。但是若它还需要同时具有其中两种特性或者是各种特性的任意组合的时候,类继承的方法就不再适合了,Decorator模式则为解决之道。De
17、corator模式的实现使用类继承解决对象行为改变问题时,关键是在派生类中覆盖需要改变行为的函数。这实际上是一种拦截函数激发的方法,在函数激发前(或后)添加新的动作而实现行为变更。截获函数激发还可先将欲拦截的函数提取到一个基类或接口中。再针对各种动作分别实现相应的类。然后通过类的联合嵌套就能实现函数的拦截。且该方法能由改变类的嵌套来达到以任何特性的组合改变函数行为的目的。这便是Decorator模式实现方案。本质上看,这是一种关于函数拦截的设计模式。Decorator模式用于Java的I/OJava的I/O系统是完全构建在Decorator模式之上的。其使用方法和我们前面介绍的例子是非常相似的
18、。实现方面则比示例要复杂些,接口和抽象类都用上了。借助Decorator模式,Java的I/O系统非常灵活,且扩展性佳。Decorator模式用于ServletServlet是用于编写动态网页的服务端组件。容器接收到Http请求后就激活相应的Servlet,由其运行后输出结果返回给客户端。在Servlet激发之前(或后)往往需要执行些附加的动作,比如显示广告、网页的一些固定标题栏等等。于是依据Decorator模式,引入了Filter。The Facade Pattern通常随着代码的增加,系统变得越来越复杂,演化出多个模块,甚至加入层式设计。特别是引入设计模式后,类的数目开始膨胀。这些都会导
19、致程序的逻辑过于复杂难懂。Faade模式提倡将复杂系统依据其各模块(或层)的功能,提取出接口,屏蔽掉具体的实现逻辑,使相互间的调用明晰简洁。这既确保了模块间的隔离性,促进模块保持职责明晰,也使系统的体系框架保持清晰。Faade模式与Factory模式Faade模式用于屏蔽模块的具体实现,Factory模式则是侧重于屏蔽创建逻辑。这两个模式综合起来后就能使得模块间做到完全隔离。两者结合的例子非常多,在所有的Java技术规范中都有很好的体现。Faade模式在J2EE中的应用J2EE程序设计中,往往采用层式结构,一般分成Web、Service、Domain和Persistence,共四个层。层与层之
20、间的调用遵照Faade模式,完全依靠接口。若是违反该原则,会造成很多不良影响。特别是涉及到远程通讯和事务的问题时,后果通常非常严重。The Proxy Pattern当需要用简单的对象来表示一个复杂对象的时候,Proxy模式便可以派上用场。若是创建对象比较耗时或消耗资源很多,则可以为其创建一个Proxy对象,将对象的创建和初始化推迟到真正需要使用其的时候进行。这也是通常所说的惰性载入策略。此外,如对象访问涉及权限问题,也可采用Proxy模式。Proxy模式的应用 EJB是典型的分布式组件,其客户端全都是通过Proxy对象与之交互的。这样容器可以从中透明地加入安全、事务、惰性载入和生存期管理等服
21、务。JDO使得客户端能以对象的方式操作数据库的数据。实际上,客户端访问的对象全是代理对象,其中实现了缓冲和惰性载入的功能。Proxy模式与Faade模式Proxy模式常常和分布式系统关联在一起,既然涉及物理上分离的系统,那么他们之间的交互调用要有一个定义良好的接口才行,这就是Facade模式所关注的问题。因此在引入Proxy模式时,往往必须先将接口进行精心设计,故连带使用了Facade模式。Behavioral PatternsChain of ResponsibilityThe Command Pattern The Interpreter PatternThe Iterator Patte
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 23种设计模式详解 2 23 设计 模式 详解
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内