黑马程序员_设计模式

——- android培训、java培训、期待与您交流! ———-

设计模式:把软件行业中出现的问题进行抽取并解决。总共有23种。 对问题行之有效的解决方式,其实它是一种思想。 设计模式分为三种类型,共23种。

创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。

结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。

行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。

设计模式可以分为三类:behavioural, structural, creational

behavioural 11 种

1. Memento(备忘录)

精巧程度: 5星

应用广泛:2星

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。

2. Chain of Responsibility(责任链)

    精巧程度: 3星

    应用广泛: 3星

为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。

适合用在"一系列handler"的场景下。分为纯和不纯两种,

3. Observer(观察者)

定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。

因为java里有Obserable和Observer, 所以通常在java里不会自己设计观察者模式。

4. Command(命令模式)

    精巧程度:4星

    应用广泛:3星

将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。

command模式用来解耦invoker和receiver.

5. State(状态模式)

    精巧程度:4星

    应用广泛:3星

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。

OO编程如果出现多个相同的if…else条件,应该考虑用state模式重构。work flow的状态器也是基于State模式的。

6. Interpreter(解释器)

    精巧程度: N/A

    应用广泛: 1星

给定一个语言,定义它的语法的一种表示,并定义一个解释器,该解释器使用该表示解释语言中的句子。

7. Strategy(策略模式)

    精巧程度: 2星

    应用广泛:4星

定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。

8. Iterator(迭代子)

    Java Collection都可以迭代,在java上不需要格外设计iterator.

9. Template Method(模板方法)

    精巧程度:2星

应用广泛:4星

    见名知义。太简单了,学过一遍就不会忘。但是这个应用非常广泛!

10. Mediator(仲裁者)

    精巧程度:4星

    应用广泛:1星

    用来解耦多个peer.个人觉得这个模式多半会让mediator十分臃肿,mediator本身需要有很清晰的设计才能使用。应用场景恐怕也少。

11. Visitor(访问者)

    精巧程度:5星

    应用广泛:2星

collection里存一个类系的entry时,使用visitor模式可以避免instance of的使用。更重要的是方便扩展类系。 

Structure 7种

12. adapter(适配器)

    精巧程度:2星

    应用广泛:1星

    将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。

13. Proxy(代理)

    精巧程度:2星

    应用广泛:5星

aop是代理模式的一种发挥。Spring和Hibernate都大量使用proxy.可以引申学学JDK的dynamic proxy.模式简单,略。

14. Bridge(桥梁)

    精巧程度: 5星

    应用广泛: 3星

Bridge在技术上是strategy的进一步发挥,但侧重在实现与抽象的解耦。

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

15. Composite

    精巧程度: 4星

    应用广泛: 3星

    适用于树状结构。

16. Decorator(装饰)

    精巧程度: 5星

    应用广泛:3星

    在java I/O中广泛使用。为了解决"类爆炸"的问题。

17. Facade(门面)



18. Flyweight

    精巧程度:5星

    应用广泛:2星

    分"单纯""复合"两种,本身包含了工厂方法模式。一系列对象如果他们都有某部分属于特定集合,就让他们共享这个特定集合以节省资源。 

Creational 6 种

19. Factory Method(工厂方法)

    精巧程度:3星

    应用广泛:4星

两个变种,一个是根据参数创建对象,一个是factory类系对应产品类系。面向接口编程在创建模式的体现。

20. Abstract Factory(抽象工厂)

精巧程度:5星

    应用广泛:1星

只有产品有两个类系的时候才用得上。

21. Builder

    精巧程度: 5星

    应用广泛: 2星

    产品分部分,并且build的过程不定的时候考虑用这种模式。是模板模式的一种发挥

22. Prototype(原型)

    java有cloneable的支持,所以通常不需要自己设计prototype. java用prototype的时候注意深复制浅复制的问题。

prototype之外的一个选择是提供一个constructor接受本类型对象作为参数,这个方式更加实用!

23. singleton(单例)

    保证一个类仅有一个实例,并提供一个访问它的全局访问点。

单例设计模式:

 解决的问题:可以保证一个类在内存中的对象唯一性。 

比如对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。

如何保证对象唯一性呢?

 1.不允许其他程序用new创建该类对象。

 2.在该类中创建一个本类实例。

 3.对外提供方法,让其他程序可以获取该对象。

步骤:

1.构造函数私有化

2.通过new在本类中创建本类的对象。

3.定义一个共有的方法将创建的对象返回。

饿汉式 一进内存 就创建好了对象 开发一般用饿汉式

classColor

{

private Color(){};

  private static final Color a=new Color();



  public static Color getcolor(){

       return a;

  }

}

懒汉式 对象是方法调用时,才初始化。 延时加载

容易出现问题 多个线程同时调用 容易造成对象不唯一

classColor

{

  private static Color  a=null;//这里不可以修饰为final

  private Color (){}

  public staticColor getcolor(){

       if(a==null){

             a=new Color();

       }

       return a;

}

}

多线程访问时会出现安全隐患

改进方法:

/**高效的同步方法的懒汉式

    1.静态的同步函数使用的锁是:该函数所属的字节码文件对象。  

    2.懒汉式可以延迟加载  

    3.多线程访问会出现安全问题,需采用同步代码块!  

*/    

classColor

{

  privatestaticColor  a=null;

  privateColor (){}

  publicstatic Color getcolor(){

       if(a==null){

             synchronized(Color.class){//改进方法 加锁

                  if (a==null){

a=new Color();

                   }

}

       }

return a;

}

}

装饰设计模式和继承都可以实现功能的扩展增强。

特点:装饰类和被装饰类都必须所属于同一个接口或者父类。

一、装饰设计模式:

   当想要对已有的对象进行功能进行增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的该类就称为装饰类。

装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。

二、装饰设计模式和继承的区别 1. 装饰模式比继承要灵活,避免了继承体系的臃肿,而且降低了类与类之间的关系

2.     装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过是提供了更强的功能,所以装饰类和被装饰了通常属于一个体系中 

三 .享元模式

对于多个相同的对象,为了优化资源,可以共享一个对象。比如说,一个文本文档中,每个字母作为一个对象的话就会占用大量内存,这就可以使用享元模式,只是字母出现的位置不同,其他的属性都相同。所以将不同的作为参数暴露出去,比如说字母出现的坐标啊,相同的属性封装起来。

你可能感兴趣的:(java,JAVA自学)