学习设计模式笔记整理

1.对象是已知的事物。
2.对象会执行的动作。
3.类是对象的蓝图,它会告诉虚拟机如何创建某种类型的对象。
4.main用途:(1)测试真正的类。(2)启动您的java应用程序。

5.第1章 单一职责原则 (单一职责原则)
  第2章 里氏替换原则 (里氏替换原则)
  第3章 依赖倒置原则 (依赖倒置原则)
  第4章 接口隔离原则 (接口隔离原则)
  第5章 迪米特法则   (迪米特法则)
  第6章 开闭原则     (开闭原则)
  第7章  单例模式
  第8章  工厂方法
  第9章  抽象工厂模式
 第10章  模板方法模式
 第11章  建造者模式
 第12章  代理模式
 第13章  原型模式
 第14章  中介者模式
 第15章  命令模式
 第16章  责任链模式
 第17章  装饰模式
 第18章  策略模式
 第19章  适配器模式
 第20章  迭代器模式
 第21章  组合模式
 第22章  观察者模式
 第23章  门面模式
 第24章  备忘录模式
 第25章  访问者模式
 第26章  状态模式
 第27章  解释器模式
 第28章  享元模式
 第29章  桥梁模式
 
6.各个职责介绍:
(1)单一职责原则:有且仅有一个原因引起类的变更。
        好处:类复杂度降低,实现什么职责都有清晰的定义。
              可读性提高,复杂度降低。
              可维护性高,复杂度降低。
               变更引起风险降低,变更是必不可少的。
              用“职责”或“变化原因”来衡量接口或
类设计得是否优良,但是“职责”和“变化原因”都是不可度量的,因项目而异,因环境而异。
          接口、类、方法使用单一原则。
      继承:能用父类的地方,都能用子类,而不会产生错误或异常。
            能用子类出现的地方,父类未必能适应。
      继承好处:代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性;
                提高代码的重用性;
                子类可以形似父类,但又异于父类;
                提高代码的可扩展性;
                提高产品或项目的开放性。
      继承坏处:继承是侵入性的;
                降低代码的灵活性;
                增强了 耦合性。

(2)里氏替换原则:子类必选完全实现父类的方法;
          
(3)依赖倒置原则:高层模块不应该依赖低层模块,两则都应该依赖其抽象;
                  抽象不应该依赖细节;
                  细节应该依赖抽象。
         模块间的依赖通过抽象发。
             面向接口编程。
      变量类型:表面类型和实际类型。
(4)依赖是可以传递的。只要做到抽象依赖,即使再多层的依赖传递也无所畏惧。

 (5) 高内聚:就是提高接口,类、模块的处理能力,减少对外的教诲。

实践、经验和领悟!

(6)如果一个方法放在本类中,既不增加类间关
系,也对本类不产生负面影响,那就放置在本类中。

  迪米特法则的核心观念就是类间解耦,弱耦合,只有弱耦合了以后,类的复用率才可以
提高。

(7)开闭原则对扩展开放,对修改关闭。但并不意味着不做任何修改,低层次模块的变化,必然要有更高层次模块进行耦合

,否则就是一个孤立无意义的代码片段。

(8)如何使用开闭原则:
     抽象约束;第一:通过接口或抽象类约束扩展,对扩展进行边界限定,不允许出现在接口或抽象类中不存在的public

方法。第二:参数类型,引用对象尽量使用接口或则抽象类。而不是实现类。第三:抽象层尽量保持稳定,一旦确定即不允

许修改。
     元数据控制模块;用元数据即配置参数,参数可以从文件中获得,也可从数据库取得。极致表现如:控制反转
     制定项目章程:制定规则。
     封装变化:第一:将相同的编号封装到一个借口或抽象类中;第二:将不同的变化封装到不同的接口或抽象类中。23种

设计模式就是从各个不同的角度对变化进行封装,
    软件实体(项目或软件产品中按照一定的逻辑规模划分;抽象和类;方法)应该对扩展开放,对修改关闭。
    如何使用开闭原则:
       抽象约束:接口或抽象类约束扩展;参数类型尽量用接口或抽象类;抽象层尽量保持稳定。
       元数据控制模块行为:元数据指:控制程序的行为,减少重复开发,通俗讲是配置参数。
       制定项目章程:
       封装变化:将相同的变化封装到一个接口后抽象类中;将不同的变化封装到不同的接口或抽象类中。
7.单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
      优点:减少内存开支;减少系统性能开销;避免 对资源的多重占用;设置全局的访问点,优化和共享资源访问。
      缺点:没有接口,扩展困难;对测试是不利的;与单一职责有冲突。

      使用场景:  (1)要生成唯一序列号的环境。
                 (2) 整个项目中需要一个共享访问点或共享数据。
                 (3) 创建一个对象需要消耗的资源过多。如访问IO或数据库等
                 (4) 需要定义大良的静态常量和静态方法。
      注意事项:(1)高并发情况下,需注意单例模式的线程同步问题。解决办法是是synchronized
               (2)需要考虑对象的复制情况。解决办法是不要实现Cloneable接口。


8.工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类中。
     优点:良好的封装性,代码结构清晰;扩展性非常优秀;典型的解耦框架。
   使用场景:(1)是new-一个对象的替代品。
             (2)需要灵活的、可扩展的框架时,可考虑采用工厂方法模式。
             (3)可以用在异构的代码中。
   扩展:

9.抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而无需指定他们的具体类。

    优点:封装性;产品族内的约束为非公开状态。

10.模板方法模式:定义一个操作中的算法框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定

义该算法的某些特定步骤。
   优点:封装不变部分,扩展可变部分。
         提取公共部分代码,便于维护。
         行为由父类控制,子类实现。

   使用场景:多个子类有公用的方法,并且逻辑相同。
             重要,复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
           重构时,模板方法模式是一个警察使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束。
   最佳实践:父类怎么调用子类的方法?
           (1)把子类传递到父类的有参构造中,然后调用。
           (2)使用反射的方式调用,你使用了反射还有谁不能调用的?
           (3)父类调用子类的静态方法。

11.建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示


12.代理模式:为其他对象提供一种代理以控制对这个对象的访问。
         subject realSubject Proxy
    优点:职责清晰;高扩展性;SPringAOP
    分类:普通代理:我们知道代理的存在,然后才能访问;
          真实代理:调用者直接调用真实的角色,而不用关心代理是否存在。

13.适配器模式:也叫包装模式(Wrapper):将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而

无法在一起工作的两个雷能够在一起工作。

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

、、、、、、、、
1.单例模式 2.工厂方法模式 3.抽象工厂模式 4.模版方法模式 5.建造者模式 6.代理模式 7.原型模式 8.中介者模


9.命令模式 10.责任链模式 11.装饰模式 12.策略模式 13.适配器模式 14.迭代器模式 15.组合模式 16.观察者模


17.门面模式 18.备忘录模式 19.访问者模式 20.状态模式 21.解释器模式 22.享元模式 23.桥梁模式

////
计模式的起源是面向对象程序设计思想,是面向对象设计的精髓——抽象。面向对象通过类和对象来实现抽象,实现时产生

了面向对象的三个重要机制:封装、继承、多态。
在学习设计模式时,一定要理解模式的适用性。必须做到使用一种模式是因为了解它的优点,不使用一种模式是因为了解它

的弊端;而不是使用一种模式是因为不了解它的弊端,不使用一种模式是因为不了解它的优点。
你可以坚持这样一个原则: 如果一个方法放在本类中,即不增加类间关系,也对本类不产生负面影响,就放置在本类中。

日本程序员善于做领导想做的事,印度程序员善于说领导想听的话。
美国程序员喜欢技术,甚至崇尚技术,文档绝对不亚于印度人 。
中国程序员:算法和数据结构比较高,注重理论知识,实践能力差,所处的环境不利,导致相当一部分人比较浮躁和 急功近

利。
商人嘛,唯利是图是其
本性,偷税漏税是方法,欺上瞒下、压榨员工血汗是常用的手段
///

(1)依赖(Dependency):关系是类与类之间的联接。表现形式:局部变量,方式的形参,或则静态方法的调用。
(2)关联(Association):类与类之间的联接,它使一个类知道另一个类的属性和方法。表现形式:成员变量实现。
                       两个类是平等层次。
(3)聚合(Aggregation):是关联关系的一种,是强的关联关系。聚合是整体和个体之间的关系。两个类不是平等。
                        一个代表整体,一个代表部分。
(4)组合(Compositioni):比聚合关系强的关系。它要求普通的聚合关系中代表整体对象的代码负责部分对象的生命周期。
                       组合关系是不能共享的。

设计模式六大原则:
(1)单一原则:一个类只负责一项职责。
     注意:职责扩散到我们无法控制的程度之前,立刻对代码进行重构。
(2)里氏替换原则:所有引用基类的地方必须能透明 地使用其子类的对象。
     注意:子类可以扩展父类的功能,但不能改变父类原有的功能。
           子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
           子类可以增加自己特有的方法。
           当子类的方法重载父类的时,前置条件(即方法的形参)要比父类方法的输入参数更宽松。。
           当子类的方法实现父类的抽象方法时,后置条件(返回条件)要比父类更严格。
(3)依赖倒置原则:高层模块不应该依赖底层模块,二则都应该依赖其抽象;
                  抽象不应该依赖细节;
                  细节应该依赖抽象;
                 依赖倒置原则的核心思想是面向接口编程
      举例:
           将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修

改类A的几率。
      实现方式:第一种是接口传递;第二种:构造方法传递;第三种:setter方法传递
      实际编程中:
          低层模块尽量都要有抽象类或接口,或者两者都有。
          变量的声明类型尽量是抽象类或接口。
          使用继承时遵循里氏替换原则。
     依赖倒置:依赖于抽象,不依赖于具体。

(4)接口隔离原则:客户端不应该依赖它不需要的接口;
                  一个类对另一个类的依赖应该建立在最小的接口上。

            含义:建立单一接口,不要建立庞大臃肿的接口,尽量细化,接口方法尽量少。
         注意:接口尽量小,但要有限度;
               为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法尽量隐藏起来,
                  只有专注地为一个模块定制服务,才能建立最小的依赖关系。
              提高内聚,减少对外交互。使用接口设计过大或过小都不好。
              

(5)迪米特法则:一个对象应该对其他对象保持最小的了解。高内聚,低耦合。
                又称为最少知道原则,只与直接的朋友通信。
                耦合的方式:依赖、关联、组合、聚合等。
                我们称出现成员变量、方法参数、方法返回值中的类为直接的朋友。
                出现在局部变量中的类则不是直接的朋友。
               通俗讲:一个类对自己依赖的类知道的越少越好。也就是说对被依赖的类来说,无论逻辑
              多么复杂,都尽量地将逻辑封装在类的内部,对外处理提供的public方法,不要对外泄露任何信息。
(6)开闭原则:一个软件实体如类、模块和函数应该对扩展开发,对修改关闭。
             当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是修改已有的代码来实现变化。
             用抽象构建框架,用实现扩展细节。
        总结:单一职责原则告诉我们实现类要职责单一;
              里氏替换原则告诉我们不要破坏继承体系;
              依赖倒置原则告诉我们要面向接口编程;
              接口隔离原则告诉我们在设计接口的时候要精简单一;
              迪米特法则告诉我们要降低耦合。
              而开闭原则是总纲,他告诉我们要对扩展开放,对修改关闭。


备注:(1)什么叫高层模块依赖于底层模块?
         高层模块一般和业务的逻辑相关,底层模块一般和具体实现相关。
      (2)何谓倒置?
         应该是处于高层的模块优先于低层的模块

//////////////////////////////23种设计模式////////////////////////
创建类模式
 1:单例模式:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。创建类模式
 2: 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
 3: 抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。
                 产品族:指位于不同产品等级结构中功能相关联的产品组成的家族。
 4:建造者模式:将一个复杂对象的构建与它的表示分离,使得相同的构建可以创建不同的表示。
   (1)产品类:一般是教复杂的对象,也就是说创建对象的过程比较复杂。
  (2)建造者:实现抽象类的所有未实现的方法。一般是两项任务:组建产品;返回组建好的产品
  (3)抽象建造者:为了将建造的具体过程交于它的子类实现。一般有两个抽象方法,一个用来建造产品,一个用来
返回产品。
  (4)导演类:负责调用适当的建造者来组建产品。导演类一般不与产品发送依赖关系,与导演类直接交互的是建造者类。
一般来说,导演类被用来封装程序中易变得部分。

5.原型模式:用原型实例指定创建对象的种类,并通过拷贝这些原型创建对象。
            原型模式主要用于对象的复制,它的核心就是类图中的原型类Prototype.Prototype类需要具备以下
            两个条件:(1)实现Cloneable接口。
                     (2)重写Object类的Clone方法。
           比较简单:实现一个接口,重写一个方法即完成了原型模式。
           使用原型模式性对象比直接new一个对象在性能上要好的多。

行为类模式
6.模板模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构
           即可重新定义该算法的某些特定步骤。
7.中介者模式:用一个中介者对象封装一系列的对象交互,中介者各对象不需要显示地相互作用,从而使
           耦合松散,而且可以独立地改变他们之间的交互。
8.观察者模式:定义对象之间一对多的依赖关系,使得当每一个对象改变状态时,则所有依赖于它的对象都会得到通知并自

动更新。

9.命令模式:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,
对请求队排队或记录请求日志,可以提供命令的撤销和恢复功能。
   执行顺序:首先是调用者类,然后是命令类,最后是接收类
10.责任链模式:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链

,并沿着这条链传递请求,直到有对象处理它为止。

11.策略模式:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。

12.访问者模式:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的操

作。
13.迭代模式:提供一种方法访问一个容器对象中各个元素,而不是暴露该对象的内部细节。
14.解释器模式:给定一种语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子。
15.备忘录模式:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存样就可以将对象恢复到原保持状态


结构性
16.适配器模式:将一个类的接口变成客户端所期待的另一种接口.
17.装饰着模式:动态地给一些类增加一些额外的职责。
18.组合模式:将对象组合成树形结构以表示整体-部分的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
19.状态模式:当一个对象内在状态改变时允许其改变.行为,核心是封装。状态的变更引起行为的变更。
20.享元模式:使用共享对象可以有效地支持大量的细粒度的对象。
21.桥梁模式:将抽象是实现解耦,使得两者可以独立变化。
////////////////////////////////模式及比较////////////////////
模式类别:
【1】创建类模式;
   包括:工厂方法模式;建造者模式;抽象工厂模式;单例模式和原型模式。
         它能提供对象的创建和管理职责。
   工厂方法模式注重整体对象的创建方法。
   建造者模式注重部件构建的过程。
【2】结构类模式;
   包括:适配器模式、桥梁模式、组合模式、装饰模式、门面模式、享元模式和代理模式。
       之所以叫结构模式:是因为他们都是通过组合类或对象产生更大结构以适应更高层次的逻辑需求。
        代理模式责重对代理过程的控制;
        装饰模式则是对类的功能进行加强或减弱。
        适配器模式包装非兄弟类;
        装饰模式包装兄弟类.
【3】行为类模式;责任链模式、命令模式、解释器模式、迭代模式、中介者模式、备忘录模式、观察者模式
              、状态模式、策略模式、模板方法模式、访问者模式

posted @ 2015-11-20 18:05  IT一族  阅读(91)  评论(0)    收藏  举报