理解一个设计模式要掌握的要点:
1.这个设计模式的意图是什么?它要解决一个什么问题?什么时候可以使用它?
2.它是如何解决问题的?掌握它的结构图,记住关键代码
3.能够想到这个设计模式的两个应用实例,一个生活中,一个软件中
4.这个模式的优缺点是什么?在使用时要注意什么
5.多运用,多实践,多运用,多实践,多运用,多实践(重要的问题说三遍!!!)
实际应用中共有三类共24中设计模式如图所示:


创建型:单例模式,简单工厂模式,工厂方法模式,抽象工厂模式,原型模式,创建者模式(6种)
结构型:适配器,桥接,组合,装饰,外观,享元,代理(7种)
行为型:访问者,策略,观察者,责任链,命令,解释器,迭代器,中介者,备忘录,状态,模板(11种)
单一职责原则 (SRP)
定义:一个类只负责一个功能领域中的相应职责,或者说,就一个类而言,应该只有一个引起它变化的原因
单一职责原则是实现高类聚,低耦合的指导方针,一个类承载的职责越多,可复用性就越低
开闭原则 (OCP)
定义:一个软件实体应该对扩展开放,对修改关闭。即软件应该在不修改现有的代码的情况下进行扩展
为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键
开闭原则是所有设计模式优缺点的一个评价要点,并以此判断系统是否具备有良好的灵活性与扩展性
里氏替换原则 (LSP)
定义:所有引用基类(父类)的地方必须能透明的使用其子类对象。也就是说在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。
在运用里氏替换原则时,应将父类设计为抽象类或者接口,让子类继承或实现父类接口,并实现再父类中声明的方法,可以很方便的扩展功能,无需修改现有子类的代码,增加新的功能可以通过增加一个新的子类实现
依赖倒转原则 (DIP)
定义:抽象不应该依赖与细节,细节应该依赖于抽象。换句话说就是:要针对接口编程,而不是针对实现编程
依赖倒置的原则要求在代码中传递参数或在关联关系中,尽量使用层次高的抽象层类,即使用接口与抽象类进行变量声明,参数类型声明以及方法返回类型声明,以及数据类型的转换,而不要使用具体类来做这些事情。一个具体的类应该只实现抽象类或者接口中的方法,否则无法调用到在子类中声明的方法。
比方说: A能读txt文件,B能读 pdf文件,调用方需要接收读文件的结果。其设计模式应为:调用方需要的只是一份文件,不管时TXT还是pdf,所以要引入一个读文件的抽象,其中有一个read方法,而A跟B实现这个抽象
在实现依赖倒转原则时需要针对抽象层进行编程,而将具体类的对象通过依赖注入的方式注入到其他对象中。依赖注入是指当一个对象要与其他对象发生关系时,通过抽象来注入所依赖的对象。
常用的注入有三种方式:构造注入,设置注入(setter)和接口注入
在一般情况下,依赖注入,里氏替换与开闭原则会同时出现,开闭原则是目标,里氏替换是基础,依赖注入是手段。
接口隔离原则 (ISP)
定义:使用多个专门的接口,而不是使用单一的总接口,即客户端不应该依赖那些它不需要的接口
当一个接口太大时,可以将其分割为一些更小的接口,每一个接口应当承担相对独立的角色。
原则就是,给你想要的,你不想要的坚决不给。
合成复用原则 (CARP)
定义:尽量使用对象组合,而不是使用继承来达到复用的目的。
迪米特法则:(CRP)
定义:一个软件实体 应当尽可能的少于其他实体发生相互作用
当一个模块发生修改时,应当尽量少的影响到其他模块,扩展相对会容易