设计模式

一、设计模式的目的

在日常开发中合理使用设计模式,可以使得代码易于理解,易于扩展,易于维护。

二、六大设计原则

单一原则

SRP: Single Responsibility Principle

定义:一个类或模块应该只负责完成一项职责。切勿把不同职责的逻辑放在同一个类或方法里。

优点:

  1. 降低类的复杂度;
  2. 提高类的可读性、可维护性;
  3. 降低变更引起的风险。

里式替换原则

LSP:Liskov Substitution Principle

定义:多用组合,少用继承。不要破坏继承体系,当扩展父类时,不要覆盖父类的非抽象方法,应该尽量去扩展。

  1. 里式替换原则时针对继承而言的,如果继承是为了实现代码重用,也就是为了共享方法,那么共享的父类方法就应该保持不变,而不能被子类重新定义。
    子类只能通过新添加方法来扩展功能,父类和子类都是可以实例化,而子类继承的方法和父类是一样的,父类调用方法的地方,子类也可以调用同一个继承得来的,逻辑与父类一致的方法,这时用子类对象将父类替换调时,当然逻辑时一致的,相安无事。
  2. 如果继承的目的是为了多态,而多态的前提就是子类覆盖并重新定义父类的方法,为了符合 LSP,我们应该将父类定义为抽象类,并定义抽象方法,让子类重新定义这些方法,当父类是抽象类时,父类时不能实例化的,所以也不存在可实例化的父类对象在程序里。
    也就不存在子类替换父类的实例时出现逻辑不一致的可能。

依赖倒置原则

DIP:Dependence Inversion Principle

定义:下层模块引入上层模块的依赖,改变原有自上而下的依赖方向。即要面向接口编程,而不是调用真正的实现方法。

接口隔离原则

IIP:Interface Isolation Principle

定义:设计接口要尽可能精简和单一,内部逻辑少对外暴露。

含义:

  1. 接口要尽量小,不违反单一职责原则,要适度的小。
  2. 接口要高内聚,提高接口、类、模块的处理能力,减少对外的交互。
  3. 定制服务,通过对高质量接口的组装,实现服务的定制化。

迪米特法则

LoD:Law of Demeter

定义:只和密友谈话,即要降低耦合,一个类要尽可能减少对其他对象的依赖。也叫最少知道原则。

含义:一个类应该对自己需要耦合或调用的类知道得最少,被耦合或被调用类的内部时如何复杂,和调用类没关系,我就只需要知道你提供了哪些 public 方法,我就调用这么多,其他的一概不关心。

开闭原则

定义:类、方法、模块应该对扩展开放,对修改关闭。

含义:简单来说就是,添加一个新功能应该在已有代码的基础上进行扩展,而不是修改已有的代码。

??小结:六大设计原则用一句话总结就是,用抽象去构建框架,用实现去扩展细节,即高内聚,低耦合

三、创建型设计模式

工厂模式

在创建一个对象时,使用工厂模式可以不对外暴露对象的创建逻辑,即业务调用者无需关心对象的创建逻辑。

优点:把创建者和调用者分离,对外隐藏创建逻辑。

简单工厂模式

定义:简单工厂其实不是一个设计模式,反而比较像时一种编程习惯。

设计模式

角色组成:

  1. 工厂类角色:工厂模式的核心,含有一定的商业逻辑和判断逻辑,用来创建产品。
  2. 抽象角色:一般是具体产品继承的父类或者实现的接口。
  3. 具体产品角色:工厂类所创建的对象就是此角色的实例。在 Java 中由一个具体类实现。

工厂方法模式

定义:定义了一个创建对象的接口(类或接口中的方法),但由子类决定要实例化的类是哪一个。工厂方法把实例化推迟到子类。

设计模式)

角色组成:

  1. 抽象工厂角色:工厂方法模式的核心,与应用程序无关。是具体工厂角色必须实现的接口或者继承的父类。在 Java 中由抽象类或接口实现。
  2. 具体工厂角色:含有和具体业务逻辑有关的代码,由应用程序调用以创建对应的具体产品对象。
  3. 抽象产品角色:是具体产品继承的父类或者实现接口。在 Java 中一般由抽象类或接口来实现。
  4. 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在 Java 中一般由具体类是心啊。
    (开闭原则)当由新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有代码。

抽象工厂模式

定义:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

设计模式

小结

工厂方法:通过抽象方法提供对象生成入口。

抽象工厂:通过接口来创建一组产品。

单例模式

定义:确保一个类只有一个实例,并提供一个全局访问点。

设计模式

五种实现方式:

  1. 饿汉式
  2. 懒汉式
  3. 双重校验锁
  4. 静态内部类
  5. 枚举类

四、行为型设计模式

适配器模式

定义:将一个类的接口转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以无间合作。

设计模式

装饰器模式

定义:动态地将责任附加到对象上。若要扩展功能,装饰器提供了比继承更加有弹性的替代方案。

设计模式
设计模式

门面模式

定义:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

设计模式

五、结构型设计模式

命令模式

定义:将"请求"封装成对象,以便使用不同的请求、队列或日志来参数化其他对象。命令模式也支持可撤销的操作。

设计模式

设计模式

迭代器模式

定义:提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。

设计模式

观察者模式

定义:定义了对象之间的一对多依赖。这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

设计模式

策略模式

定义:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

设计模式

模版方法模式

定义:在一个方法中定义一个算法的骨架,将一些步骤延迟到子类中。

模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

设计模式

设计模式

上一篇:maven安装


下一篇:Jenkins github账号密码验证方式失效 解决方式