设计模式 | 详解设计模式的七大原则

目录

 

一、设计模式的目的

二、设计模式七大原则

1、单一职责原则

2、接口隔离原则

3、依赖倒转原则

4、里氏替换原则

5、开闭原则

6、迪米特法则

7、合成复用原则

设计原则核心思想


一、设计模式的目的

编写软件的过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战,设计模式是为了让程序具有更好的:

  • 代码重用性(即相同功能的代码,不用多次编写)
  • 可读性(即编程规范性,便于其他程序员的阅读和理解)
  • 可扩展性(即当需要增加新功能时,非常方便,称为可维护)
  • 可靠性(即当我们增加新的功能后,对原来的功能没有影响)
  • 使程序呈现高内聚,低耦合的特性

二、设计模式七大原则

设计模式的七大原则有:

  • 单一职责原则
  • 接口隔离原则
  • 依赖倒转原则
  • 里氏替换原则
  • 开闭原则
  • 迪米特法则
  • 合成复用原则

1、单一职责原则

概念:对类来说,即一个类应该只负责一项职责

如类A负责两个不同职责:职责1、职责2。当职责1需求变更而改变A类时,可能造成职责2执行错误,因此要将类A的粒度分解为A1、A2。

单一职责原则的注意事项

  • 降低类的复杂性,一个类只负责一项职责
  • 提高类的可读性,可维护性
  • 降低变更引起的风险
  • 通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则(只有类中方法数量足够少,才可以在方法级别保持单一职责原则。即把“降低类的复杂性”同个分解为多个方法来实现)。

2、接口隔离原则

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

通俗一点来说就是一个类通过接口去依赖另一个类时,这个接口不应该存在太多多余的方法。可以将大的接口拆分成多个小的接口

示例

我们现在有一个接口,接口里面有五个方法,然后有一个类B和类D分别实现了该接口。然后类A和类C分别通过这个接口去依赖类B和类D,但是他们只会用到接口的部分方法,第一种写法如下:

package com.cxc.principle.segregation;

/**
 * 实现:类B和类D分别去实现接口1
 *      然后类A通过接口1依赖类B(使用了1,2,3方法)
 *      类C通过接口1依赖类D(使用了1,4,5方法)
 */
public class Segregation1 {

    public static void main(String[] args) {
        A a = new A();
        a.depend1(new B()); //类A通过接口去依赖类B
    }
}

/**
 * 接口1
 */
interface Interface1{
    void operation1();
    void operation2();
    void operation3();
    void operation4();
    void operation5();
}

class B implements Interface1{
    @Override
    public void operation1() {
        System.out.println("B 实现了operation1");
    }

    @Override
    public void operation2() {
        System.out.println("B 实现了operation2");
    }

    @Override
    public void operation3() {
        System.out.println("B 实现了operation3");
    }

    @Override
    public void operation4() {
        System.out.println("B 实现了operation4");
    }

    @Override
    public void operation5() {
        System.out.println("B 实现了operation5");
    }
}

class D implements Interface1{
    @Override
    public void operation1() {
        System.out.println("D 实现了operation1");
    }

    @Override
    public void operation2() {
        System.out.println("D 实现了operation2");
    }

    @Override
    public void operation3() {
        System.out.println("D 实现了operation3");
    }

    @Override
    public void operation4() {
        System.out.println("D 实现了operation4");
    }

    @Override
    public void operation5() {
        System.out.println("D 实现了operation5");
    }
}

/**
 * A类通过Interface1依赖B类,但是只会用到1,2,3方法
 */
class A{
    public void depend1(Interface1 i){
        i.operation1();
    }
    public void depend2(Interface1 i){
        i.operation2();
    }
    public void depend3(Interface1 i){
        i.operation3();
    }
}
/**
 * C类通过Interface1依赖D类,但是只会用到1,4,5方法
 */
class C{
    public void depend1(Interface1 i){
        i.operation1();
    }
    public void depend4(Interface1 i){
        i.operation4();
    }
    public void depend5(Interface1 i){
        i.operation5();
    }
}

上面这种代码实现的话,就不符合我们的接口隔离原则,接口隔离原则中强调我们要将接口依赖降低到最小接口,而不论是类A还是类C,依赖时都并没有使用到接口的全部方法。

因此我们要进行改进,将大接口分解成小接口

你可能感兴趣的:(学习之路,JavaWeb,随记,设计模式,java,面试)