JAVA设计模式总结--------七大设计原则

一.单一职责原则

对类来说,一个类负责一项职责,比如Dao层的类就负责增删改查的职责,他不会影响到业务层的类的操作。

  • 如果一个类承担的职责过多,就等于把这些职责耦合在一起了。一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭受到意想不到的破坏。而如果想要避免这种现象的发生,就要尽可能的遵守单一职责原则。此原则的核心就是解耦和增强内聚性。

二.接口隔离原则

客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。

  • 使用多个专门的接口比使用单一的总接口要好。
  • 一个类对另外一个类的依赖性应当是建立在最小的接口上的。最小的接口就是该类能用到的所有接口,如果继承了没用的接口,那就不能称为最小的接口

JAVA设计模式总结--------七大设计原则_第1张图片
示例图,A和C两个类只继承自己需要用到的接口,而不是把所有接口合起来一块继承。

三.依赖倒转原则

  • 高层模块不应该依赖低层模块,二者都应该依赖抽象
  • 抽象不应该依赖细节,细节应该依赖抽象
  • 中心思想是面向接口编程

在Java语言中, 抽象就是指接口或抽象类, 两者都是不能直接被实例化的; 细节就是实现类, 实现接口或继承抽象类而产生的类就是细节, 其特点就是可以直接被实例化。

public class Person {
    public void  receive(Email email){
        System.out.println(email.getInfo());
    }
}

class Email{

    public String getInfo(){
        return "邮件内容:hello";
    }
}

看一个例子,Person类想要获取邮件信息,在它的参数中实例化了一个Email对象,这个就叫做依赖了Email对象,假如下次想要接收微信,qq信息就需要重写方法。

public class Person {
    public void  receive(receiver receiver){
        System.out.println(receiver.getInfo());
    }
}

class Email implements  receiver{

    public String getInfo(){
        return "邮件内容:hello";
    }
}

interface receiver{
    public String getInfo();
}

改写之后,定义一个抽象的接口receiver,任何种类的消息比如微信,qq只需要实现该接口的getInfo方法就可以了。

四.里氏替换原则

官方定义如下:

  • 如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2 时,程序P的行为没有发生变化,那么类型 S 是类型 T 的子类型

解释:所有引用基类的地方必须能透明地使用其子类的对象。只要父类能出现的地方子类就可以出现,而且替换为子类也不会 产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。也就是说,软件里面,把父类都替换成它的子类,程序的行为没有变化,这就是符合里氏替换原则。


五.开闭原则

开闭原则规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的

  • 其含义是说一个软件实体应该通过扩展来实现变化, 而不是通过修改已有的代码来实现变化
  • 开闭原则在程序中具体实现有很多,比如用抽象类和接口,实体类继承的方式而不是直接用实体类继承。

六.迪米特法则 (最少知道原则)

定义:一个对象应该对其他对象保持最少的了解。

  • 就是一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类来说,无论逻辑多么复杂,都尽量的将逻辑封装在类的内部,对外除了提供的public方法,不对外泄露任何信息。
  • 只与直接的朋友通信,什么是直接的朋友:每个对象都会与其它对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式有很多(依赖、关联、组合、聚合…等)。其中,我们称出现成员变量、方法参数、方法返回值中的类为直接朋友关系,而出现在局部变量中的类则不是直接的朋友关系。也就是说,陌生的类最好不要作为局部变量的形式出现在类的内部。

七.合成复用原则

合成复用原则是指尽量使用合成/聚合,而不是使用继承。

采用组合或聚合复用时,可以将已有对象纳入新对象中,使之成为新对象的一部分,新对象可以调用已有对象的功能,这样就避免了直接继承带来的耦合。它有如下优点:

  • 它维持了类的封装性。因为成分对象的内部细节是新对象看不见的,所以这种复用又称为“黑箱”复用。
  • 新旧类之间的耦合度低。这种复用所需的依赖较少,新对象存取成分对象的唯一方法是通过成分对象的接口
  • 复用的灵活性高。这种复用可以在运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象。

你可能感兴趣的:(Java设计模式)