一、设计模式的目的
在日常开发中合理使用设计模式,可以使得代码易于理解,易于扩展,易于维护。
二、六大设计原则
单一原则
SRP: Single Responsibility Principle
定义:一个类或模块应该只负责完成一项职责。切勿把不同职责的逻辑放在同一个类或方法里。
优点:
- 降低类的复杂度;
- 提高类的可读性、可维护性;
- 降低变更引起的风险。
里式替换原则
LSP:Liskov Substitution Principle
定义:多用组合,少用继承。不要破坏继承体系,当扩展父类时,不要覆盖父类的非抽象方法,应该尽量去扩展。
- 里式替换原则时针对继承而言的,如果继承是为了实现代码重用,也就是为了共享方法,那么共享的父类方法就应该保持不变,而不能被子类重新定义。
子类只能通过新添加方法来扩展功能,父类和子类都是可以实例化,而子类继承的方法和父类是一样的,父类调用方法的地方,子类也可以调用同一个继承得来的,逻辑与父类一致的方法,这时用子类对象将父类替换调时,当然逻辑时一致的,相安无事。- 如果继承的目的是为了多态,而多态的前提就是子类覆盖并重新定义父类的方法,为了符合
LSP
,我们应该将父类定义为抽象类,并定义抽象方法,让子类重新定义这些方法,当父类是抽象类时,父类时不能实例化的,所以也不存在可实例化的父类对象在程序里。
也就不存在子类替换父类的实例时出现逻辑不一致的可能。
依赖倒置原则
DIP:Dependence Inversion Principle
定义:下层模块引入上层模块的依赖,改变原有自上而下的依赖方向。即要面向接口编程,而不是调用真正的实现方法。
接口隔离原则
IIP:Interface Isolation Principle
定义:设计接口要尽可能精简和单一,内部逻辑少对外暴露。
含义:
- 接口要尽量小,不违反单一职责原则,要适度的小。
- 接口要高内聚,提高接口、类、模块的处理能力,减少对外的交互。
- 定制服务,通过对高质量接口的组装,实现服务的定制化。
迪米特法则
LoD:Law of Demeter
定义:只和密友谈话,即要降低耦合,一个类要尽可能减少对其他对象的依赖。也叫最少知道原则。
含义:一个类应该对自己需要耦合或调用的类知道得最少,被耦合或被调用类的内部时如何复杂,和调用类没关系,我就只需要知道你提供了哪些 public
方法,我就调用这么多,其他的一概不关心。
开闭原则
定义:类、方法、模块应该对扩展开放,对修改关闭。
含义:简单来说就是,添加一个新功能应该在已有代码的基础上进行扩展,而不是修改已有的代码。
??小结:六大设计原则用一句话总结就是,用抽象去构建框架,用实现去扩展细节,即高内聚,低耦合。
三、创建型设计模式
工厂模式
在创建一个对象时,使用工厂模式可以不对外暴露对象的创建逻辑,即业务调用者无需关心对象的创建逻辑。
优点:把创建者和调用者分离,对外隐藏创建逻辑。
简单工厂模式
定义:简单工厂其实不是一个设计模式,反而比较像时一种编程习惯。
角色组成:
- 工厂类角色:工厂模式的核心,含有一定的商业逻辑和判断逻辑,用来创建产品。
- 抽象角色:一般是具体产品继承的父类或者实现的接口。
- 具体产品角色:工厂类所创建的对象就是此角色的实例。在 Java 中由一个具体类实现。
工厂方法模式
定义:定义了一个创建对象的接口(类或接口中的方法),但由子类决定要实例化的类是哪一个。工厂方法把实例化推迟到子类。
)
角色组成:
- 抽象工厂角色:工厂方法模式的核心,与应用程序无关。是具体工厂角色必须实现的接口或者继承的父类。在 Java 中由抽象类或接口实现。
- 具体工厂角色:含有和具体业务逻辑有关的代码,由应用程序调用以创建对应的具体产品对象。
- 抽象产品角色:是具体产品继承的父类或者实现接口。在 Java 中一般由抽象类或接口来实现。
- 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在 Java 中一般由具体类是心啊。
(开闭原则)当由新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有代码。
抽象工厂模式
定义:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
小结:
工厂方法:通过抽象方法提供对象生成入口。
抽象工厂:通过接口来创建一组产品。
单例模式
定义:确保一个类只有一个实例,并提供一个全局访问点。
五种实现方式:
- 饿汉式
- 懒汉式
- 双重校验锁
- 静态内部类
- 枚举类
四、行为型设计模式
适配器模式
定义:将一个类的接口转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以无间合作。
装饰器模式
定义:动态地将责任附加到对象上。若要扩展功能,装饰器提供了比继承更加有弹性的替代方案。
门面模式
定义:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
五、结构型设计模式
命令模式
定义:将"请求"封装成对象,以便使用不同的请求、队列或日志来参数化其他对象。命令模式也支持可撤销的操作。
迭代器模式
定义:提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
观察者模式
定义:定义了对象之间的一对多依赖。这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
策略模式
定义:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
模版方法模式
定义:在一个方法中定义一个算法的骨架,将一些步骤延迟到子类中。
模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。