对设计模式的理解

时间:2022-10-01 21:03:39

来着:http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html

建造类:

1. 工厂模式:简单工程模式,通过传入参数,创建对应实例。无法扩展。

2. 工厂方法模式:通过扩展工厂方法,来实现扩展。

3. 抽象工厂模式:通过扩展相应的产品接口,不需要修改工厂方法,即可实现扩展。Spring Bean 工厂。

4. 单例模式:懒汉模式,饱汉模式。如何解决synchronized问题。通过内部静态类来创建(内部静态类JVM加载时,会给定顺序,从而解决了多线程冲突问题)。

5. 建造者模式:使用场景:隐藏创建过程,分离必选和非必选项。例如:elasticsh构建查询条件,如果设置了就用,如果没设置用默认的。数据库JDBC操作也是   注:而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性。

6. 原型模式:常见为复制粘贴。包含:深克隆和浅克隆。通信栈对象过于复杂,当时就是用的深克隆来创建创建相同的对象。浅克隆的特色:内部属性引用在内存里为同一个位置。


结构型模式:

1. 适配器模式:

       类的适配器模式:当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。
       对象的适配器模式:当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例的方法就行。
      接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个抽象类Wrapper,实现所有方法,我们写别的类的时候,继承抽象类即可。

2. 装饰者模式: 

    使用场景:a. 需要扩展一个类的功能。b. 动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)

   注:适配器模式和装饰者模式:两者都可以叫包装模式

           装饰模式:需要扩展一个类的功能或者给你个类增加附加责任;需要动态的给一个对象增加功能,这些功能可以再动态的撤销;需要增加有一些基本功能的排列组合而产生非常大量的功能,从而使得继承关系变得不现实。
           适配器模式:系统需要使用现有的类,但此类已经不符合系统的需要。

3. 代理模式: 与装饰者模式基本相似。但是装饰者模式,是通过参数形式,传入需被装饰的对象。

                        代理模式是通过代理者构造方法来创建被代理的对象。

            两种的区别:代理在编译的时候就已经确认构造好,而装饰者是通过动态来装饰的。

           代理模式使用到极致开发就是AOP。

           装饰者模式在JDK的java.io.*包中就大量使用装饰模式,OutputStream out = new DataOutputStream( new FileOutputStream( "test.txt") )  使用DataOutputStream封装了一个FileOutputStream。

4. 外观模式:外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口。

    实际上就是:通过一个综合对象,来实现复杂功能。例如:综合对象的方法:开机方法:(包含:打开硬盘,打开内存等),关闭方法:(包含:关闭硬盘,关闭内存等)。

    在Spring配置文件中通过构造方法来加入一些对象。例如:自定义分页之类的。

5. 桥接模式:桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化。桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不用动,原因就是JDBC提供统一接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了。

    注:JDBC中通过注入不同的数据库方言,来实现动态构造不同数据库操作类型。

6. 组合模式:http://www.runoob.com/design-pattern/composite-pattern.html

   意图:将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

   主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

   何时使用: 1、您想表示对象的部分-整体层次结构(树形结构)。 2、您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

   如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。

   关键代码:树枝内部组合该接口,并且含有内部属性 List,里面放 Component。

   应用实例: 1、算术表达式包括操作数、操作符和另一个操作数,其中,另一个操作符也可以是操作树、操作符和另一个操作数。 2、在 JAVA AWT 和 SWING 中,对于 Button 和 Checkbox 是树叶,Container 是树枝。

   优点: 1、高层模块调用简单。 2、节点*增加。

   缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

   使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。

   注意事项:定义时为具体类。

7. 享元模式:享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。


行为模式:

1. 策略模式:定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数.策略模式的决定权在用户,系统本身提供不同算法的实现,新增或者删除算法,对各种算法做封装。因此,策略模式多用在算法决策系统中,外部用户只需要决定用哪个算法即可。

     注:策略模式是一种行为模式。例如:日志保存过程,如果日志内容过大则存文件,反之存数据库。那么我们有公共的日志操作接口,不同的实现方式。策略模式就是根据不同情况(日志长度大小)来调用那个具体实现类。这也是设计模式单一职责的一种体现。也可以理解为把核心功能抽象出来,根据不同也不有不同的辅助代码。

2. 模板方法模式:定义好模板流程,抽象类定义抽象方法,并抽出功能非抽象方法。

注解:策略模式与模板模式的区别:

          模板方法模式的主要思想:定义一个算法流程,将一些特定步骤的具体实现、延迟到子类。使得可以在不改变算法流程的情况下,通过不同的子类、来实现“定制”流程中的特定的步骤。
          策略模式的主要思想:使不同的算法可以被相互替换,而不影响客户端的使用。

         策略模式更注重于: 一个“策略”是一个 整体的(完整的) 算法,算法是可以被整体替换的。而模板方法只能被替换其中的特定点,算法流程是固定不可变的。

3. 观察者模式:观察者模式很好理解,类似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时,经常会看到RSS图标,就这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你。其实,简单来讲就一句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。

        注:观察者都是继承抽象观察者,然后加入到观察者业务工厂里面,当业务变化时,则会调用相应的观察者实现的抽象方法。

4. 迭代子模式:Java集合中的Iterator()方法。如果一个聚集的接口没有提供修改聚集元素的方法,这样的接口就是所谓的窄接口。聚集对象为迭代子对象提供一个宽接口,而为其他对象提供一个窄接口。换言之,聚集对象的内部结构应当对迭代子对象适当公开,以便迭代子对象能够对聚集对象有足够的了解,从而可以进行迭代操作。但是,聚集对象应当避免向其他的对象提供这些方法,因为其他对象应当经过迭代子对象进行这些工作,而不是直接操控聚集对象。

5. 责任链模式:有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求。常见:树结构,线程中的join

6. 命令模式:命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。

   注解:司令员只需要发出命令,不同的命令需要注入不同的执行者,最后执行者执行。命令模式的目的就是达到命令的发出者和执行者之间解耦

7. 备忘录模式:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

      注:类似撤销功能,原发器  备忘录  负责人三者之间,负责人通过操作原发器来实现创建备忘录,加入备忘录,撤销回退功能。如果用栈或者堆可存储多个备忘录,而实现多次恢复。常见的备忘录模式:事物等。

8. 状态模式:核心思想就是:当对象的状态改变时,同时改变其行为,很好理解!状态模式在日常开发中用的挺多的,尤其是做网站的时候,我们有时希望根据对象的某一属性,区别开他们的一些功能,比如说简单的权限控制等。

9. 访问者模式:

10: 中介者模式:中介者模式也是用来降低类类之间的耦合的,因为如果类类之间有依赖关系的话,不利于功能的拓展和维护,因为只要修改一个对象,其它关联的对象都得进行修改。如果使用中介者模式,只需关心和Mediator类的关系,具体类类之间的关系及调度交给Mediator就行,这有点像spring容器的作用。

11: 解释器模式: