一、设计模式的分类

为什么用设计模式:代码重用性 可读性 可扩展性 可靠性 程序高内聚 低耦合
总体来说分为三大类:
创建型模式,5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,7种:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,11种:策略模式、模板方法模式、观察者模式、迭代模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

二、设计模式的七大原则

1、开闭原则(Open Close Principle)
开闭原则就是说对扩展开放,对修改关闭。要达到这种效果,一般需要使用接口和抽象类。

2、里氏代换原则(Liskov Subsitutution Principle LSP)
任何基类可以出现的地方,子类一定可以出现。LSP是继承复用的基石,只有当衍生类可以替换掉基类,(软件单位的功能不受到影响时,基类才能真正被复用),而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。
里氏产生原因:
继承包含的含义:父类中凡是已经实现好的方法,实际上是指设定规范和契约,虽然它不强制要求所有的子类必须遵循这些契约,但是如果子类对这些已经实现的方法任意修改,就会对整个继承体系造成破坏。
继承的缺点:给程序带来侵入性,程序的可移植性降低,增加对象间的耦合性,如果一个类被其他的类继承,则当这个类需要修改是,必须考虑到所有的子类,并且父类修改后,所有涉及到子类的功能都有可能产生故障。
里氏替换原则:在使用继承是,子类中尽量不要重写父类的方法。继承和让两个类的耦合性增强,在适当的情况下,可以通过聚合,组合,依赖,来解决问题。

3、依赖倒转原则(Dependence Inversion Principle))
这个是开闭原则的基础,具体内容:针对接口编程,依赖抽象而不依赖于具体。

4、接口隔离原则(Interface Segregation Principle)
使用多个隔离的接口,比使用单个接口要好,还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。

5、迪米特法则(最少知道原则)(Demeter Principle)
一个实体类应当尽量少的与其他实体类之间发生相互作用,使得系统功能模块相对独立。
基本介绍:
1、一个对象应该对其他对象保持最少的了解
2、类与类关系越密切,耦合度越大

6、合成复用原则(Composite Reuse Priciple)
原则是尽量使用合成/聚合的方式,而不是使用继承。

7、单一职责原则
① 降低类的复杂度,一个类只负责一项职责
②提高类的可读性,可维护性
③降低变更引起的风险
④通常情况下:应该遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中方法数量足够小,可以在方法级别保持单一职责原则。

三、常见模式分析

1.Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点。

2.Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。

3.Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Mehtod使得同样的构建过程可以创建不同的表示。
①普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
②多个工厂方法模式,对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。
③静态工厂方法模式,将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接用类调用方法。

4.Proxy,代理模式:为一个对象提供一种代理,以控制对这个对象的访问
代理模式的不同形式:静态代理,动态代理(JDK代理、接口代理)和Cglib代理(可以在内存动态的创建对象,而不需要实现接口,它也属于动态代理。)
三种方式的优缺点:
静态代理:优点 :在不修改目标对象的功能前提下,能通过代理对象对目标功能扩展。
缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类。
一旦接口增加方法,目标对象和代理对象都需要维护
动态代理:缺点:目标对象必须要实现接口,因此动态代理也叫接口代理;
代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象。
Cglib代理:
① 静态代理和JDK代理模式都要求目标对象是实现一个接口,但是有时候目标对象只是一个单独的对象,并没有实现任何的接口,这个时候可使用目标对象子类来实现代理-这就是Cglib代理
② Cglib代理也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能的扩展
③ AOP 编程如何选择代理模式:
1)目标对象需要实现接口,用JDK代理
2)目标对象不需要实现接口,用Cglib代理

5.Decrator,装饰模式:给一个对象添加一些额外的职责,就添加的功能列说,Decorator模式相比生成子类更加灵活。

6.Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变是,所有依赖于他的对象都得到通知自动更新。