设计模式 (1)

J2EE设计模式

本章主要目标

设计模式概念\r\rJ2EE设计模式简介\r\rJ2EE模式简单应用\r

设计模式概念

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 \r\r

使用设计模式好处

\r复用代码:使用设计模式能够复用解决方案,通过复用已经公认的设计,避免重蹈前人覆辙。用不着为那些总是会重复出现的问题再次设计解决方案。 \r\r易于维护: 大多数设计模式还能够使软件更容易修改和维护。其原因在于,他们都是久经考验的解决方案。所以,他们的结构都是长期发展形成的,比新构思的解决方案更善于应对变化。而且,这些设计模式所用的代码往往更易于理解,从而使代码更容易维护。 \r提高学习:在开发团队中使用设计模式的经验证明,设计模式即可以帮助开发人员个人的学习,也可以帮助团队提高。\r

设计模式分类

设计模式的分类有好几种,可以根据其目的分为创建型(Creational),结构型(Structural)和行为型(Behavioral)三种\r\r创建模式:主要是用来创建对象\r\r结构模式:主要是处理类或对象的组合\r\r行为模式:主要用来描述对类或对象怎样交互和怎样分配职责

创建模式

1.Abstract?Factory:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。\r\r2.Builder: ?将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。\r\r3.Factory?Method:定义一个用于创建对象的接口,让子类决定实例化哪一个类。使一个类的实例化延迟到其子类。\r\r4.Prototype:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。\r\r5.Singleton:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

结构模式

1.Adapter:将一个类的接口转换成客户希望的另外一个接口。\r2.Bridge:将抽象部分与它的实现部分分离,使它们都可以独立的变化。\r3.Composite:将对象组合成树形结构以表示“部分-整体”的层次结构。\r4.Decorator:动态地给一个对象添加一些额外的职责。\r5.Fa?ade(外观模式):为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。\r6.Flyweight(享元模式):运用共享技术有效地支持大量细粒度的对象。\r7.Proxy:为其它对象提供一种代理以控制对这个对象的访问。

行为模式

1.Chain?of?Responsibility:? ?使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。\r2.Command:??将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。\r3.Interpreter(解释器模式):?给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语句中的句子。\r4.Iterator:? ?提供一种方法顺序访问一个聚合对象中的各个元素,而不需要暴露该对象的内部表示。\r5.Mediator(调停者模式):? ?用一个中介对象来封装一系列的对象交互。\r6.Memento(备忘录模式):?在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。\r7.Observer:??定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。\r8.State(状态模式):?允许一个对象在其内部状态改变时改变它的行为。\r9.Strategy:?定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。\r10.Template?Method(模板方法模式):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。\r11.Visitor(访问者模式):表示一个作用于某对象结构中的各元素的操作。

设计模式之Factory -工厂模式

客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。\r缺点是当产品修改时,工厂类也要做相应的修改。

设计模式之Factory -工厂模式

追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory

设计模式之Factory -工厂模式

public class Factory{   \r public static Sample creator(int which){\r  //getClass 产生Sample 一般可使用动态类装载装入类。   if (which==1)     return new SampleA();   else if (which==2)     return new SampleB();\r  }\r}

设计模式之FACTORY METHOD -工厂方法模式

核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

设计模式之FACTORY METHOD -工厂方法模式

请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。 \r

设计模式之FACTORY METHOD -工厂方法模式

public abstract class Factory{   \r public abstract Sample creator();\r  public abstract Sample2 creator(String name); \r}\rpublic class SimpleFactory extends Factory{\r  public Sample creator(){     .........     return new SampleA   }\r  public Sample2 creator(String name){     .........     return new Sample2A   }\r}\rpublic class BombFactory extends Factory{\r  public Sample creator(){     ......     return new SampleB   }\r  public Sample2 creator(String name){     ......     return new Sample2B   }\r}\r

模式应用

Spring:BeanFactory\r\rHibernate:SessionFactory

設計模式之Facade -门面模式

外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。

設計模式之Facade -门面模式

我有一个专业的Nikon相机,我就喜欢自己手动调光圈、快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会。幸好相机有Facade设计模式,把相机调整到自动档,只要对准目标按快门就行了,一切由相机自动调整,这样MM也可以用这个相机给我拍张照片了。

設計模式之Facade -门面模式

1、假设你有一个类,里面分别提供了对某表的insert,update,delete,select方法。如果人家要对此表操作,就调用你这个类。可是你想这么做:对于那些高安全性的开发者,你可以给整个类的各种方法。可是对那些低安全性的开发者(比如第三方合作者),就只给select方法。 ? ? 于是你再做了一个类,只有select方法(其实就是调用前面那个类的select),把这个facade类开发给低安全性开发者。这就是facade的第一个作用:隐藏 ? ? ? ? 2、假设你有多个类,分别管理多表的操作。现在有个需求,可能一个事务涉及到多表的操作(比如用户登录,先要在用户表验证密码,然后再到登录日志表记一笔),那么你可以做一个facade,把这一系列的操作封装成一个方法。人家不用跟底层的单表打交道,只简单调用你的facade的方法就OK。这就是facade的第二个作用:封装 ? \r3.从客户程序的角度看,Facade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果——内部子系统的任何变化不会影响到Facade接口的变化

模式应用

Struts 调用spring的操作\r如:在权限操作中(角色,权限,人员),当操作角色删除时候,将角色权限中间表及人员角色中间表相关数据删除.spring服务可将该操作合并在一个bean中,无需在struts调用多个bean.

模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。

設計模式之TEMPLATE METHOD-模板方法模式

設計模式之TEMPLATE METHOD-模板方法模式

追MM圣经规定了追MM在不同时期有不同的步骤(Template method),但每个步骤针对不同的情况,都有不一样的做法,这就要看你随机应变啦(具体实现); \r实际上就是把一件事情分成几步来完成。每一步就是一个方法(也叫做原子操作)。也就是说,我把做一件事情规定好了几步(规定了个模版),但每一步里实际干些什么就由客户去决定了。

設計模式之TEMPLATE METHOD-模板方法模式

一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。\r\r实际上介绍了为什么要使用Java 抽象类,该模式原理简单,使用很普遍.

模式应用

Spring中的JdbcTemplate ,HibernateTemplate都是template模式的典型应用.

catchMM

请看一个实例--追MM,我把追MM分成了认识她、接近她、感动她三步(然后下一步能否追到还要看一点的运气了,可能成了你的妹妹,呵呵),伪代码如下: 追MM { ?认识她; ?接近她; ?感动她; } 注意上面的三步是我已经定义好了,它们之间的先后关系是不能更改的,能改的只是每一步的实际内容。\r张三是这样完成这三步的: 1、认识她:扮曾经认识。张三:"哎呀,我们好像在什么地方见过。" MM想:"真是老土死了"。 2、接近她:张三:"有没兴趣晚上一起自习啊?" MM想:"唉呀,怎么男的全来这一招啊?" 3、感动她:张三:"我要向全世界说爱你!!" MM想:"真是无聊,爱我关全世界什么事?" 结果,张三失败了。

catchMM

一雨田是这样完成三步的: 1、?认识她:一雨田说:"你宿舍的XX好漂亮啊!!"。MM想:"这个人怎么不注意一下我呢?难道我比某人差吗?"(嘻嘻,女人的妒忌心就要这样利用了) 2、?接近她:一雨田说:"我要去跑步了,你个胖妞,你别跟着来啊!"MM说:"哼,我就是要去,怎么样?"。(呵呵,以退为进) 3、?感动她:一雨田说:"帮你切牛扒吧,整天手忙脚乱的"然后一块块细心的切好。MM想:"从来没人帮我这样切牛扒的。。。"。呵呵,乘胜追击。一雨田深情的轻轻的说:"让我一辈子帮你切牛扒吧。" MM:无语(流泪,感动)。(注:要从小地方去感动MM) 结果,一雨田成功了。\r呵呵,明白Template Method模式了吧