﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-辰o(^o^)o的专栏[除非注释原创，其它文章基本来源于网络]-文章分类-设计模式</title><link>http://www.blogjava.net/jackybu/category/964.html</link><description>&lt;a href="http://www.fastonlineusers.com"&gt;&lt;b&gt;&lt;font color=red&gt;共有&lt;script src=http://fastonlineusers.com/online.php?d=jackybu.blogjava.net&gt;&lt;/script&gt;人在同时阅读此Blog&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 07:46:27 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 07:46:27 GMT</pubDate><ttl>60</ttl><item><title>[转贴]设计模式的实际应用 </title><link>http://www.blogjava.net/jackybu/articles/10494.html</link><dc:creator>辰</dc:creator><author>辰</author><pubDate>Fri, 19 Aug 2005 05:23:00 GMT</pubDate><guid>http://www.blogjava.net/jackybu/articles/10494.html</guid><wfw:comment>http://www.blogjava.net/jackybu/comments/10494.html</wfw:comment><comments>http://www.blogjava.net/jackybu/articles/10494.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackybu/comments/commentRss/10494.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackybu/services/trackbacks/10494.html</trackback:ping><description><![CDATA[通常，概念和这些概念在现实世界中的应用是有区别的，设计模式也不例外。 <BR><BR>　　设计模式无处不在。在阅读技术方面的出版物或者浏览技术方面的网站时，很容易发现对设计模式的引用。到目前为止，您很可能已经阅读过（至少翻阅过）一些设计模式方面的书籍，如《Core J2EE Design Patterns》或者Gang of Four编写的《Design Patterns》。此时，您可能会对设计模式有一些疑问。设计模式如何帮助我？他们是银弹吗？使用设计模式有什么问题吗？为什么我不能从集成开发环境（integrated development environment，IDE）中获得设计模式？<BR>　　上述的几个问题是采用设计模式进行处理过程中遇到的一些经典问题。通常，概念和这些概念在显示世界中的应用是有区别的，设计模式也不例外。本文将讨论设计模式在现实世界中的应用。这些信息可以帮助您成功地在项目中采用设计模式来作出正确的决定。<BR><BR><B>快速概述</B><BR>　　设计模式提供了一种共享经验的方式，可以使团体受益和避免不断的重复发明。设计模式通常捕捉问题的描述、问题的语境、推荐的问题解决方案以及使用解决方案后可以预见到的结果。为了具有最广泛的适用性（从而对更多的读者有用），设计模式通常从取决于环境的精确细节中抽象而来。这种抽象性产生了一些把设计模式应用到现有的案例中所必需的译码。这是一个重要细节：尽管设计模式是共享专业知识的好方法，但通常它对正确应用专业知识是非常重要的。<BR>　　设计模式这个概念最初产生于建筑行业。设计师（设计建筑物而不是计算机系统）意识到他们需要共享有关正确设计技术的想法。这些想法是在可以使设计师团体从分享经验和教训中获益的设计模式中形成的。设计模式在80年代后期从建筑业进入计算机系统领域。面向对象（Object-oriented，OO）原则逐渐得到普及，而设计模式成为培育新的OO追随者的最佳实践。<BR>　　Richard Gamma等（人们通常把他们称作 Gang of Four [GoF] ）编著的《Design Patterns: Elements of Reusable Object-Oriented Software》一书使设计模式成为万众瞩目的焦点。随着设计模式逐渐普及，他们所涉及的领域就像“Ben and Jerry”效应那样也逐渐广泛起来。对那些不熟悉著名冰淇淋品牌的人来说，Ben and Jerry是一家冰淇淋产品的供应商，其冰淇淋产品拥有各种可以想象得到的配料组合（还包括一些您永远想象不到的）。因此，它就是设计模式，和普通的OO设计模式一样来源于GoF的著作，但是现在包括了专为开发语言、应用服务器、行业合成等提供的设计模式。<BR><BR><B>设计模式分类</B><BR>　　设计模式通常根据一些公共特性而组合在一起。GoF的著作把设计模式划分为三类：Creational、Behavioral和Structural。用于J2EE的设计模式通常划分为表现层（Presentation Tier）、业务逻辑层（Business Logic Tier）和集成层（Integration Tier）。这种分组方式可以使描述所有设计模式共享的公共细节更加轻松，或者使设计模式的分类和发现更加轻松。<BR>　　在对设计模式实际应用的讨论中，需要把设计模式划分为两类：broad exposure和isolated use。这种划分基于设计模式对应用程序设计人员和开发人员的可见性和应用程序的多个部分对设计模式的相依性。<BR>　　Broad exposure 设计模式因为可以影响多个团队成员或者应用程序的多个方面的设计和开发而闻名。这类设计模式的品质包括： 
<UL>
<LI>采用它会对很多根据设计模式创建的类产生负面影响。 
<LI>应用程序的不同部分知道设计模式的使用。 
<LI>使用这种设计模式的决定不能轻易取消。 </LI></UL>
<P>　　这类设计模式的例子有Model-View-Controller（MVC）模式、Value Object J2EE模式和Data Access Object（DAO）J2EE模式<BR>　　Isolated use是指设计模式的使用是隐藏细节的设计模式。这类设计模式的品质包括：</P>
<UL>
<LI>设计模式不影响其他团队成员或者应用程序其他部分的工作。 
<LI>可以轻松地更改使用设计模式的决定，而且产生的影响极小。 </LI></UL>
<P>　　这类设计模式的例子有Singleton GoF模式或者Intercepting Filter J2EE模式。<BR>　　将设计模式划分为几类为了解设计模式的范围提供了一种快速的方法。了解范围使评估设计模式的影响更加轻松。可以使用或者抛弃这种设计模式吗？一旦采用这种设计模式就会影响应用程序的设计吗？这种设计模式影响了应用程序的多个部分和其他的应用程序了吗？预先了解这些影响为采用设计模式提供了指导。<BR><BR><B>设计模式应用AntiPatterns </B><BR>　　随着设计模式逐渐普及，出现了另一种叫做AntiPatterns的模式类型。尽管设计模式提供了关于可重复的最佳方法的专业知识，但是AntiPatterns通常描述应当避免的重复行为。AntiPatterns 验证了这样的事实：做错事情和办对事情的人一样多。<BR>　　本节将探讨设计模式采用中的AntiPatterns。了解这些AntiPatterns可以帮助您避免设计模式采用中的缺陷。如同设计模式一样，在他们提供了一些远见或者他们是一些非常熟悉的环境时，在他们可以为您的经验添加色彩和使您不再感到孤独时，此处的AntiPatterns是一个全新的概念。如果您想阅读更多有关AntiPatterns的资料，请参见本文结尾处的资源列表。<BR><BR><B>AntiPattern清单</B><BR><B>设计模式?是的，我们全部拥有</B><BR><B>　　问题：</B>决定在项目中使用哪一种设计模式。<BR><B>　　应用：</B> 既有broad exposure又有isolated use设计模式。<BR><B>　　环境：</B>一位开发人员通过介绍希望在一项工程中使用设计模式。<BR><B>　　动力：</B>AntiPattern的动力通常有两种来源。一种是开发人员通过包括设计模式的最佳实践来改进项目的渴望。另一种是开发人员天生的好奇心驱使他利用这个项目来研究设计模式。<BR><B>　　推荐的解决方案：</B>项目中应用了所有知名的设计模式。设计模式手册生成一份清单，而目标是可以核对所有的设计模式。<BR><B>　　产生的语境：</B>项目团队和交付的应用程序由于不自然地引入太多设计模式而遭受损失。这就导致设计和开发非常复杂。这种不必要的复杂性会从已经完成的工作量、开发团队了解发生事情的能力、应用程序的实际性能和功能的正确性等方面影响开发成果。<BR><B>　　设计基本原理：</B>设计模式是专业知识的主要来源。尽管使用他们的效果很好，但是全部使用他们就未必也是好的。<BR>实际解决方案：设计模式的描述包含了使用模式的目标语境。必须考虑如何确保设计模式匹配项目。第二，设计模式不是来源于当某人阅读了一本设计模式的著作后，问：“我可以把这个设计模式使用在什么地方？”而是来源于某人寻找已发现问题的解决方案。<BR><BR><B>Developer/Project AntiPattern的实现</B><BR>　　(也称为：Design pattern xyz? Yeah，我们有10个)<BR><B>　　问题：</B>在项目中或者项目之间控制设计模式的实现。<BR><B>　　应用：</B>broad exposure和isolated use设计模式都从解决这种环境中受益。但是，broad exposure设计模式无疑控制了实现。<BR><B>　　语境：</B>开发团队将设计模式结合到项目中。团队由许多经验丰富的开发人员组成，他们知道应该什么时候使用设计模式。所以会正确的设计模式。如果涉及到多个项目，项目之间没有设计模式实现共享。<BR><B>　　动力：</B>最终期限日益临近，团队成员工作效率很高。重新使用实现会影响团队效率。假设他们都是专家，他们的实现都非常优秀。在多项目情况中，跨团队通信和代码共享要么没有被考虑，要么被作为进度表中的潜在影响被排除。<BR><B>　　推荐的解决方案：</B>团队可以根据需要单独包含和实现设计模式。<BR><B>　　产生的语境：</B>即使使用了正确的设计模式，但是他们是以很多不同的方式实现的。在限制集成和重新使用成果的实现之间存在不兼容。很多不必要的时间和工作被花费在维护、调试和扩展各种实现上。最终，各种实现都将被统一。<BR><B>　　设计基本原理：</B>应当允许专家成员独立工作。只要所包含的设计模式足够好，就不需要共享实现。<BR><B>　　实际解决方案：</B>开发团队应当协调设计模式的使用。共享设计模式的公共实现可在将来降低成本，但是更重要的是，它使开发人员之间互相兼容。如果需要，这种共享可以被限制到划归先前讨论的broad exposure设计模式内。重用实现在项目间也极有价值，尤其在未来将要集成的时候。<BR><BR><B>设计模式采用中IDE的角色</B><BR>　　IDE在继续发展和提供更多的功能。最初的IDE组成了一种编辑环境和一些调试工具。现在，他们通常包含设计环境、审计工具、配置管理系统集成等等。随着IDE不断扩展范围，需要确认他们在设计模式实现中的角色。诚然，设计模式在开发语言中实现，而IDE可以用于编辑源代码。但是，IDE可以扮演其他的角色吗?<BR>　　一些IDE具有下拉菜单，使您能够选择应用程序中包括的设计模式。虽然这可以加快设计模式的使用，但是它只会导致更快地编写出极差的代码。评估这个特性需要记住几个因素。<BR>　　第一，设计模式在抽象中描述问题，并需要一些译码来达到正确的实现。但是，他们常常包含“示例实现（sample implementation）”，并且IDE正是将这种示例类结构插入到应用程序中。这很可能不是所需要的实现，并且把他们放到应用程序中将带来更多的困惑，以及需要更多的编辑和重构工作而不是思考最初的实现。<BR>　　第二，和IDE拖放设计模式方法有关的另一个问题是前面讨论的两种AntiPatterns。加快设计模式的实现很可能会产生大量的设计模式应用，以及同一设计模式的多种版本，而不是解决任意问题的版本。<BR>　　设计模式面临的挑战不仅仅是得到一次快速实现，而是确定使用了正确的实现，以及机构中已有的一个完美的实现。<BR><BR><B>BEA WebLogic Workshop 8.1和设计模式</B><BR>　　您可能是一位BEA的客户，如果您正在阅读本文，您可能想知道新的BEA WebLogic Workshop 8.1是如何影响您的设计模式考虑的。首先，WebLogic Workshop是IDE，因此前面有关IDE的章节同样适用。对这些讨论感兴趣的Workshop的两个额外方面是控件和预实现的设计模式。 <BR>　　WebLogic Workshop Controls是打包功能的一种方法，可以轻松将其包含到使用Workshop IDE的应用程序中。打包包括IDE必需的可视元素、运行时行为、要求的配置等等。控件是如何影响设计模式应用的呢？还记得设计模式在前面划分为isolated use和broad exposure吗？划分到isolated use类的设计模式可能被打包成 Workshop Controls。把设计模式作为控件打包可使 Workshop IDE的其他用户共享实现，从而避免了每一个Developer/Project AntiPattern中的实现。<BR>　　您可能想知道为什么broad exposure设计模式为什么不可以作为控件实现。原因是broad exposure设计模式导致创建了许多其他类或者独立于其他应用程序。这种情况就不适合控件的即插即用方面。broad exposure设计模式的采用应当三思而后行，一旦采用就不能轻易取消。这些要求不符合WebLogic Workshop Control的目标。<BR>　　WebLogic Workshop还具有很多预实现设计模式，如Pageflow和用户接口结构。在Workshop 中，您可以创建JSP和定义Pageflow来控制Web应用程序页面之间的定位。在这种情况下，WebLogic Workshop使用流行的Apache Struts 表现层框架。Workshop的这个方面（使用 Struts）提供了一种Model-View-Controller（MVC）设计模式实现，意味着不用创建自己的MVC实现。Workshop包含的其他功能很可能替代您自己的设计模式实现。尽管一些设计模式实现的开盒即用很好，但是应当验证不仅实现而且实现创建的WebLogic任何依从性也非常合适。<BR><BR><B>成功采用设计模式的三个步骤</B><BR>　　如何把设计模式的采用和日益临近的最后期限、紧缩的预算和很多公司现有的有限团队资源相结合？以下是成功制订设计模式的三个步骤。<BR><BR><B>强大的通信和培训</B><BR>　　许多机构拥有领先技术，可能正式通过了设计师论坛的论证或者非正式的公认专家。这些领先厂商将推广设计模式采用中的开放通信，并将培训开发具体设计模式的团队。通信应当跨开发团队和项目以便预先防止采用竖井和多种惟一的实现（谨记每个Developer/Project AntiPattern的实现）。培训可以采用正式的internal lunch-and-learns、正式的internal class或者派一些员工参加外部培训。这些培训方式将促进正确的设计模式应用程序。如果仅有极少的观众能够参加培训，最佳的候选人是那些感觉适合在回来后能够培训其同事的人。<BR><BR><B>设计模式采用指导</B><BR>　　设计模式可用于使项目受益，但是他们也可能因为误用而对应用程序造成损害。应当鼓励采用他们，但是对其的采用应当受到审阅和验证。设计模式可以包含在设计和开发过程中。在任何一种情况中，设计模式的使用应当由审阅者确认和验证。在审阅过程中还可能会遇到这样的情况，额外的设计模式不适用于最初包括的地方。即使环境中没有进行正式的审阅，这一步骤也可以通过同事审阅或者团队讨论来完成。这一步骤中的审阅者要么是主要团队的成员，要么与他们建立开放通信。 <BR>　　指导采用对于broad exposure类别的设计模式非常关键。这些设计模式具有很多相关的风险，因为他们将创建依赖性。这些依赖性可能在一些对象类中，例如，只工作在更加广泛的DAO设计模式实现范围中的数据访问对象（DAO）、或者跨应用程序边界（如使用Value Object设计模式在应用程序和应用程序层之间传输数据）。这些设计模式也可以由项目中的其他人或者不同项目的人实现，而且实现应当重新使用，不同于创建另一种独特的实现。<BR><BR><B>重用实现,不只是设计模式</B><BR>　　只要在创建自己的设计模式实现中有一定的满足，团队和公司就可以在重用发生在代码层时，而不是设计创意层时获得更多益处。使企业获益的最初设计模式是改进的实现。但是，真正的目标是重用实现。重用实现将导致：a)其他可重用的类（取决于公共实现）；b)缩短开发时间和降低成本；c)缩短维护时间和降低成本；d)在应用程序之间和内部轻松集成。<BR>　　这种重用对broad exposure设计模式非常重要（有时是基本的）。这些设计模式创建了外部依赖性（集成将从公共实现中受益）或者产生全部的自定义类库（如果有公共基础将可重用）。isolated use设计模式也可以从重用中获益，但是如果他们是根据具体情况定制的，他们就非常难以重用。<BR>　　有时您可能会问自己：“如果重用比较好，为什么设计模式和可以重用的实现不可以一同应用呢？”在我们讨论设计模式如何使更多读者获益的时候才会讨论这个问题。如果可能，如果已经预定义了实现，那么达到广泛适用性这个目标就会非常困难。然而，一旦设计模式被应用到特殊的问题域或者技术基础设施中，那么就可以重用在该环境中产生的实现。<BR><BR><B>架构中的设计模式</B><BR>　　这看起来像是一件可怕的任务，需要掌握设计模式如何应用在实际情况中，如何构建优质的实现，以及如何促进重用实现。完成该任务的方法之一就是在环境中引入应用程序架构。应用程序架构提供了应用程序需要的结构，从而使开发团队可以关注应用程序的域逻辑。这包含了已实现的设计模式。除了重用设计模式概念或者单个实现之外，可以在多个项目和应用程序之间重用架构。这种共享的公共实现确保了兼容性，并为开发和维护多种不同的实现提供了一种低成本替代方案。兼容性提供了重新使用需要的技术基础。没有足够的篇幅在这里深入讨论架构的其他重要品质，如运行时监测和管理、可配置应用程序逻辑和适应性行为等。您可以从Carnegie Mellon Software Engineering Institute (<A href="http://www.sei.cmu.edu/ata/ata_init.html" target=_blank>www.sei.cmu.edu/ata/ata_init.html</A>) 中学习到更多有关架构的知识。<BR><BR><B>结束语</B><BR>　　设计模式是一种令人惊异的资源，应该使用他以增加您的优势。虽然设计模式提供了可重用的概念，但是面临的挑战是决定使用哪一种设计模式和致力于可以重用的实现。通过了解采用设计模式中会产生的风险，就可以在继续学习和实现更多设计模式时避免风险。<BR>　　按照本文概述的步骤会产生一个流程，用于在团队和机构中推广成功的设计模式采用。<BR><BR><B>参考资料</B></P>
<UL>
<LI>Brown、William J.；Malveau、Raphael C.；McCormick、Hays W. "Skip"；Mowbray、Thomas J. (1998)。《AntiPatterns: Refactoring Software, Architectures, and Projects in Crisis》，John Wiley &amp; Sons 
<LI>AntiPatterns：<A href="http://www.antipatterns.com/" target=_blank>www.antipatterns.com</A> 
<LI>Wiki站点：<A href="http://c2.com/cgi/wiki?AntiPattern" target=_blank>http://c2.com/cgi/wiki?AntiPattern</A> </LI></UL>
<P>关于作者<BR>Walter Hurst是Wakesoft的奠基人和首席技术官。他在尖端技术领域工作了十年。成立Wakesoft 之前，Walter是一名独立咨询师，主要使用Wakesoft技术的早期版本为客户提供互联网解决方案。在此之前，Walter是Xpedior的技术设计师，负责领导internal efforts开发实现在多个客户项目中的应用程序架构。在加入Xpedior之前，Walter是Andersen Consulting?Center战略技术方面的高级咨询师。在Andersen，Walter为多家财富100客户领导Enterprise项目。Walter在密歇根州大学获得计算机工程学士学位。</P><img src ="http://www.blogjava.net/jackybu/aggbug/10494.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackybu/" target="_blank">辰</a> 2005-08-19 13:23 <a href="http://www.blogjava.net/jackybu/articles/10494.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[设计模式]关于23种设计模式的有趣见解(转)</title><link>http://www.blogjava.net/jackybu/articles/2895.html</link><dc:creator>辰</dc:creator><author>辰</author><pubDate>Thu, 07 Apr 2005 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/jackybu/articles/2895.html</guid><wfw:comment>http://www.blogjava.net/jackybu/comments/2895.html</wfw:comment><comments>http://www.blogjava.net/jackybu/articles/2895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackybu/comments/commentRss/2895.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackybu/services/trackbacks/2895.html</trackback:ping><description><![CDATA[<A><FONT color=#000000><STRONG>创建型模式</STRONG> <BR><BR>1、FACTORY—追MM少不了请吃饭了，麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西，虽然口味有所不同，但不管你带MM去麦当劳或肯德基，只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory <BR><BR>工厂模式：客户类和工厂类分开。消费者任何时候需要某种产品，只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时，工厂类也要做相应的修改。如：如何创建及如何向客户端提供。 <BR><BR>2、BUILDER—MM最爱听的就是“我爱你”这句话了，见到不同地方的MM,要能够用她们的方言跟她说这句话哦，我有一个多种语言翻译机，上面每种语言都有一个按键，见到MM我只要按对应的键，它就能够用相应的语言说出“我爱你”这句话了，国外的MM也可以轻松搞掂，这就是我的“我爱你”builder。（这一定比美军在伊拉克用的翻译机好卖） <BR><BR>建造模式：将产品的内部表象和产品的生成过程分割开来，从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化，客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。 <BR><BR>3、FACTORY METHOD—请MM去麦当劳吃汉堡，不同的MM有不同的口味，要每个都记住是一件烦人的事情，我一般采用Factory Method模式，带着MM到服务员那儿，说“要一个汉堡”，具体要什么样的汉堡呢，让MM直接跟服务员说就行了。 <BR><BR>工厂方法模式：核心工厂类不再负责所有产品的创建，而是将具体创建的工作交给子类去做，成为一个抽象工厂角色，仅负责给出具体工厂类必须实现的接口，而不接触哪一个产品类应当被实例化这种细节。 <BR><BR>4、PROTOTYPE—跟MM用QQ聊天，一定要说些深情的话语了，我搜集了好多肉麻的情话，需要时只要copy出来放到QQ里面就行了，这就是我的情话prototype了。（100块钱一份，你要不要） <BR><BR>原始模型模式：通过给出一个原型对象来指明所要创建的对象的类型，然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类，产品类不需要非得有任何事先确定的等级结构，原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。 <BR><BR>5、SINGLETON—俺有6个漂亮的老婆，她们的老公都是我，我就是我们家里的老公Sigleton，她们只要说道“老公”，都是指的同一个人，那就是我(刚才做了个梦啦，哪有这么好的事) <BR><BR>单例模式：单例模式确保某一个类只有一个实例，而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。 <BR><BR><STRONG>结构型模式</STRONG> <BR><BR>6、ADAPTER—在朋友聚会上碰到了一个美女Sarah，从香港来的，可我不会说粤语，她不会说普通话，只好求助于我的朋友kent了，他作为我和Sarah之间的Adapter，让我和Sarah可以相互交谈了(也不知道他会不会耍我) <BR><BR>适配器（变压器）模式：把一个类的接口变换成客户端所期待的另一种接口，从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。 <BR><BR>7、BRIDGE—早上碰到MM，要说早上好，晚上碰到MM，要说晚上好；碰到MM穿了件新衣服，要说你的衣服好漂亮哦，碰到MM新做的发型，要说你的头发好漂亮哦。不要问我“早上碰到MM新做了个发型怎么说”这种问题，自己用BRIDGE组合一下不就行了 <BR><BR>桥梁模式：将抽象化与实现化脱耦，使得二者可以独立的变化，也就是说将他们之间的强关联变成弱关联，也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系，从而使两者可以独立的变化。 <BR><BR>8、COMPOSITE—Mary今天过生日。“我过生日，你要送我一件礼物。”“嗯，好吧，去商店，你自己挑。”“这件T恤挺漂亮，买，这条裙子好看，买，这个包也不错，买。”“喂，买了三件了呀，我只答应送一件礼物的哦。”“什么呀，T恤加裙子加包包，正好配成一套呀，小姐，麻烦你包起来。”“……”，MM都会用Composite模式了，你会了没有？ <BR><BR>合成模式：合成模式将对象组织到树结构中，可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。 <BR><BR>9、DECORATOR—Mary过完轮到Sarly过生日，还是不要叫她自己挑了，不然这个月伙食费肯定玩完，拿出我去年在华山顶上照的照片，在背面写上“最好的的礼物，就是爱你的Fita”，再到街上礼品店买了个像框（卖礼品的MM也很漂亮哦），再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来……，我们都是Decorator，最终都在修饰我这个人呀，怎么样，看懂了吗？ <BR><BR>装饰模式：装饰模式以对客户端透明的方式扩展对象的功能，是继承关系的一个替代方案，提供比继承更多的灵活性。动态给一个对象增加功能，这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。 <BR><BR>10、FACADE—我有一个专业的Nikon相机，我就喜欢自己手动调光圈、快门，这样照出来的照片才专业，但MM可不懂这些，教了半天也不会。幸好相机有Facade设计模式，把相机调整到自动档，只要对准目标按快门就行了，一切由相机自动调整，这样MM也可以用这个相机给我拍张照片了。 <BR><BR>门面模式：外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口，使得子系统更易于使用。每一个子系统只有一个门面类，而且此门面类只有一个实例，也就是说它是一个单例模式。但整个系统可以有多个门面类。 <BR><BR>11、FLYWEIGHT—每天跟MM发短信，手指都累死了，最近买了个新手机，可以把一些常用的句子存在手机里，要用的时候，直接拿出来，在前面加上MM的名字就可以发送了，再不用一个字一个字敲了。共享的句子就是Flyweight，MM的名字就是提取出来的外部特征，根据上下文情况使用。 <BR><BR>享元模式：FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部，不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态，它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来，将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象，而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。 <BR><BR>12、PROXY—跟MM在网上聊天，一开头总是“hi,你好”,“你从哪儿来呀？”“你多大了？”“身高多少呀？”这些话，真烦人，写个程序做为我的Proxy吧，凡是接收到这些话都设置好了自动的回答，接收到其他的话时再通知我回答，怎么样，酷吧。 <BR><BR>代理模式：代理模式给某一个对象提供一个代理对象，并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下，客户不想或者不能够直接引用一个对象，代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象，而仅仅持有一个被代理对象的接口，这时候代理对象不能够创建被代理对象，被代理对象必须有系统的其他角色代为创建并传入。 <BR><BR><STRONG>行为模式</STRONG> <BR><BR>13、CHAIN OF RESPONSIBLEITY—晚上去上英语课，为了好开溜坐到了最后一排，哇，前面坐了好几个漂亮的MM哎，找张纸条，写上“Hi,可以做我的女朋友吗？如果不愿意请向前传”，纸条就一个接一个的传上去了，糟糕，传到第一排的MM把纸条传给老师了，听说是个老处女呀，快跑! <BR><BR>责任链模式：在责任链模式中，很多对象由每一个对象对其下家的引用而接 <BR><BR>起来形成一条链。请求在这个链上传递，直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求，系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择：承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。 <BR><BR>14、COMMAND—俺有一个MM家里管得特别严，没法见面，只好借助于她弟弟在我们俩之间传送信息，她对我有什么指示，就写一张纸条让她弟弟带给我。这不，她弟弟又传送过来一个COMMAND，为了感谢他，我请他吃了碗杂酱面，哪知道他说：“我同时给我姐姐三个男朋友送COMMAND，就数你最小气，才请我吃面。”，:-( <BR><BR>命令模式：命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开，委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来，使得请求的一方不必知道接收请求的一方的接口，更不必知道请求是怎么被接收，以及操作是否执行，何时被执行以及是怎么被执行的。系统支持命令的撤消。 <BR><BR>15、INTERPRETER—俺有一个《泡MM真经》，上面有各种泡MM的攻略，比如说去吃西餐的步骤、去看电影的方法等等，跟MM约会时，只要做一个Interpreter，照着上面的脚本执行就可以了。 <BR><BR>解释器模式：给定一个语言后，解释器模式可以定义出其文法的一种表示，并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后，使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构，也就是一系列的组合规则。每一个命令对象都有一个解释方法，代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。 <BR><BR><BR><BR>16、ITERATOR—我爱上了Mary，不顾一切的向她求婚。 <BR><BR>Mary：“想要我跟你结婚，得答应我的条件” <BR><BR>我：“什么条件我都答应，你说吧” <BR><BR>Mary：“我看上了那个一克拉的钻石” <BR><BR>我：“我买，我买，还有吗？” <BR><BR>Mary：“我看上了湖边的那栋别墅” <BR><BR>我：“我买，我买，还有吗？” <BR><BR>Mary：“你的小弟弟必须要有50cm长” <BR><BR>我脑袋嗡的一声，坐在椅子上，一咬牙：“我剪，我剪，还有吗？” <BR><BR>…… <BR><BR>迭代子模式：迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集，聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中，从而与聚集本身隔开。迭代子模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象，每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。 <BR><BR>17、MEDIATOR—四个MM打麻将，相互之间谁应该给谁多少钱算不清楚了，幸亏当时我在旁边，按照各自的筹码数算钱，赚了钱的从我这里拿，赔了钱的也付给我，一切就OK啦，俺得到了四个MM的电话。 <BR><BR>调停者模式：调停者模式包装了一系列对象相互作用的方式，使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时，不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为一对多的相互作用。调停者模式将对象的行为和协作抽象化，把对象在小尺度的行为上与其他对象的相互作用分开处理。 <BR><BR>18、MEMENTO—同时跟几个MM聊天时，一定要记清楚刚才跟MM说了些什么话，不然MM发现了会不高兴的哦，幸亏我有个备忘录，刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存，这样可以随时察看以前的记录啦。 <BR><BR>备忘录模式：备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下，将一个对象的状态捉住，并外部化，存储起来，从而可以在将来合适的时候把这个对象还原到存储起来的状态。 <BR><BR>19、OBSERVER—想知道咱们公司最新MM情报吗？加入公司的MM情报邮件组就行了，tom负责搜集情报，他发现的新情报不用一个一个通知我们，直接发布给邮件组，我们作为订阅者（观察者）就可以及时收到情报啦 <BR><BR>观察者模式：观察者模式定义了一种一队多的依赖关系，让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时，会通知所有观察者对象，使他们能够自动更新自己。 <BR><BR>20、STATE—跟MM交往时，一定要注意她的状态哦，在不同的状态时她的行为会有不同，比如你约她今天晚上去看电影，对你没兴趣的MM就会说“有事情啦”，对你不讨厌但还没喜欢上的MM就会说“好啊，不过可以带上我同事么？”，已经喜欢上你的MM就会说“几点钟？看完电影再去泡吧怎么样？”，当然你看电影过程中表现良好的话，也可以把MM的状态从不讨厌不喜欢变成喜欢哦。 <BR><BR>状态模式：状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里，每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候，其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时，系统便改变所选的子类。 <BR><BR>21、STRATEGY—跟不同类型的MM约会，要用不同的策略，有的请电影比较好，有的则去吃小吃效果不错，有的去海边浪漫最合适，单目的都是为了得到MM的芳心，我的追MM锦囊中有好多Strategy哦。 <BR><BR>策略模式：策略模式针对一组算法，将每一个算法封装到具有共同接口的独立的类中，从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类，各种算法在具体的策略类中提供。由于算法和环境独立开来，算法的增减，修改都不会影响到环境和客户端。 <BR><BR>22、TEMPLATE METHOD——看过《如何说服女生上床》这部经典文章吗？女生从认识到上床的不变的步骤分为巧遇、打破僵局、展开追求、接吻、前戏、动手、爱抚、进去八大步骤(Template method)，但每个步骤针对不同的情况，都有不一样的做法，这就要看你随机应变啦(具体实现)； <BR><BR>模板方法模式：模板方法模式准备一个抽象类，将部分逻辑以具体方法以及具体构造子的形式实现，然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法，从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架，而将逻辑的细节留给具体的子类去实现。 <BR><BR>23、VISITOR—情人节到了，要给每个MM送一束鲜花和一张卡片，可是每个MM送的花都要针对她个人的特点，每张卡片也要根据个人的特点来挑，我一个人哪搞得清楚，还是找花店老板和礼品店老板做一下Visitor，让花店老板根据MM的特点选一束花，让礼品店老板也根据每个人特点选一张卡，这样就轻松多了； <BR><BR>访问者模式：访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话，接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统，它把数据结构和作用于结构上的操作之间的耦合解脱开，使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很容易，就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中，而不是分散到一个个的节点类中。当使用访问者模式时，要将尽可能多的对象浏览逻辑放在访问者类中，而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。<BR></FONT></A><img src ="http://www.blogjava.net/jackybu/aggbug/2895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackybu/" target="_blank">辰</a> 2005-04-07 10:42 <a href="http://www.blogjava.net/jackybu/articles/2895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>映射模式介绍 </title><link>http://www.blogjava.net/jackybu/articles/1755.html</link><dc:creator>辰</dc:creator><author>辰</author><pubDate>Sat, 05 Mar 2005 15:07:00 GMT</pubDate><guid>http://www.blogjava.net/jackybu/articles/1755.html</guid><wfw:comment>http://www.blogjava.net/jackybu/comments/1755.html</wfw:comment><comments>http://www.blogjava.net/jackybu/articles/1755.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackybu/comments/commentRss/1755.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackybu/services/trackbacks/1755.html</trackback:ping><description><![CDATA[<SPAN class=postbody>发现几篇关于对象关系映射的文章，总结了各种对象/关系的映射方式和这些映射方式的应用环境以及各种映射方式下数据访问的效率。介绍的很细致，值得一看。 <BR><BR><A class=postlink href="http://www.linuxaid.com.cn/articles/3/8/385232802.shtml" target=_blank>概述</A> <BR><BR><A class=postlink href="http://www.linuxaid.com.cn/articles/4/5/458698163.shtml" target=_blank>对象/关系映射--聚合模式</A> <BR><BR><A class=postlink href="http://www.linuxaid.com.cn/articles/4/9/492565019.shtml" target=_blank>对象/关系映射--继承模式</A> <BR><BR><A class=postlink href="http://www.linuxaid.com.cn/articles/8/0/802053421.shtml" target=_blank>对象/关系映射--关联模式</A></SPAN><img src ="http://www.blogjava.net/jackybu/aggbug/1755.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackybu/" target="_blank">辰</a> 2005-03-05 23:07 <a href="http://www.blogjava.net/jackybu/articles/1755.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>