1.设计模式的七大原则

设计模式常用的七大原则有:

1) 单一职责原则

2) 接口隔离原则

3) 依赖倒转(倒置)原则

4) 里氏替换原则

5) 开闭原则

6) 迪米特法则

7) 合成复用原则

 

1.单一职责原则

对类来说的,即一个类应该只负责一项职责。如类A负责两个不同职责:职责1,职责2。 当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为 A1,A2

不遵循单一职责

代码演示

package com.wang.principle.singleresponsibility;
public class SingleResponsibility {
    public static void main(String[] args) {
        Vehicle vehicle = new Vehicle();
        vehicle.run("汽车");
        vehicle.run("火车");
        vehicle.run("飞机");
    }
}
class Vehicle{
    public void  run(String s)
    {
        System.out.println(s+"正在公路上跑。。。");
    }
}

结果:

汽车正在公路上跑。。。
火车正在公路上跑。。。
飞机正在公路上跑。。。

显然飞机在公路上跑不符合

解决办法,一个类只负责一项职责

package com.wang.principle.singleresponsibility;

public class SingleResponsibility2 {
    public static void main(String[] args) {

        RoadVehicle roadVehicle = new RoadVehicle();
        roadVehicle.run("汽车");

        WaterVehicle waterVehicle = new WaterVehicle();
        waterVehicle.run("轮船");

        AirVehicle airVehicle = new AirVehicle();
        airVehicle.run("飞机");
    }
}
class RoadVehicle{
    public void  run(String s)
    {
        System.out.println(s+"正在公路上跑。。。");
    }

}
class WaterVehicle{
    public void  run(String s)
    {
        System.out.println(s+"正在水里跑。。。");
    }

}
class AirVehicle{
    public void  run(String s)
    {
        System.out.println(s+"正在天空上跑。。。");
    }
}

或者一个方法负责一个职责

package com.wang.principle.singleresponsibility;

public class SingleResponsibility3 {

    public static void main(String[] args) {

        Vehicle2 vehicle2 = new Vehicle2();
        vehicle2.runRoad("汽车");
        vehicle2.runAir("飞机");
        vehicle2.runWater("轮船");

    }
}


class Vehicle2{
    public void  runRoad(String s)
    {
        System.out.println(s+"正在公路上跑。。。");
    }

    public void  runAir(String s)
    {
        System.out.println(s+"正在天空跑。。。");
    }

    public void  runWater(String s)
    {
        System.out.println(s+"正在水上跑。。。");
    }


}

单一职责原则注意事项和细节 1) 降低类的复杂度,一个类只负责一项职责。 2) 提高类的可读性,可维护性 3) 降低变更引起的风险 4) 通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违 反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则

 

2) 接口隔离原则

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

1.设计模式的七大原则

 

 

 上图类A通过接口Interface1依赖类B,类C通过 接口Interface1依赖类D,如果接口 Interface1对于类A和类C来说不是最小接口, 那么类B和类D必须去实现他们不需要的方 法。

实例代码

package com.wang.principle.segregation;

public class Segregation1 {

public static void main(String[] args) {

A a = new A();
a.depend1(new B());
a.depend2(new B());
a.depend3(new B());




}
}

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

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

public void operation2() {
System.out.println("B 实现了 operation2");
}
public void operation3() {
System.out.println("B 实现了 operation3");
}
public void operation4() {
System.out.println("B 实现了 operation4");
}
public void operation5() {
System.out.println("B 实现了 operation5");
}
}

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

public void operation2() {
System.out.println("D 实现了 operation2");
}
public void operation3() {
System.out.println("D 实现了 operation3");
}
public void operation4() {
System.out.println("D 实现了 operation4");
}
public void operation5() {
System.out.println("D 实现了 operation5");
}
}


class A { //A 类通过接口Interface1 依赖(使用) B类,但是只会用到1,2,3方法
public void depend1(Interface1 i) {
i.operation1();
}
public void depend2(Interface1 i) {
i.operation2();
}
public void depend3(Interface1 i)
{
i.operation3();

}

}


class C { //C 类通过接口Interface1 依赖(使用) D类,但是只会用到1,4,5方法
public void depend1(Interface1 i) {
i.operation1();
}
public void depend4(Interface1 i) {
i.operation4();
}
public void depend5(Interface1 i) {
i.operation5();
}
}

 

解决方法

将接口Interface1拆分为独立的几个接口, 类A和类C分别与他们需要的接口建立依赖 关系。也就是采用接口隔离

 

 

 1.设计模式的七大原则

1.设计模式的七大原则

 

 

 

1) 类A通过接口Interface1依赖类B,类C通过接口Interface1依赖类D,如果接口 Interface1对于类A和类C来说不是最小接口,那么类B和类D必须去实现他们不 需要的方法

2) 将接口Interface1拆分为独立的几个接口,类A和类C分别与他们需要的接口建立 依赖关系。也就是采用接口隔离原则

3) 接口Interface1中出现的方法,根据实际情况拆分为三个接口

4) 代码实现

package com.wang.principle.segregation.improve;

public class Segregation1 {

    public static void main(String[] args) {

        A a = new A();
        a.depend1(new B());
        a.depend2(new B());
        a.depend3(new B());

        C c = new C();
        c.depend1(new D());
        c.depend4(new D());
        c.depend5(new D());

    }
}

//接口
interface Interface1 {
    void operation1();

}


interface Interface2 {
    void operation2();

    void operation3();
}

interface Interface3 {
    void operation4();

    void operation5();
}

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

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

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

}

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

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

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


class A { //A 类通过接口Interface1 依赖(使用) B类,但是只会用到1,2,3方法
    public void depend1(Interface1 i) {
        i.operation1();
    }

    public void depend2(Interface2 i) {
        i.operation2();
    }

    public void depend3(Interface2 i) {
        i.operation3();

    }

}

class C { //C 类通过接口Interface1 依赖(使用) D类,但是只会用到1,4,5方法
    public void depend1(Interface1 i) {
        i.operation1();
    }

    public void depend4(Interface3 i) {
        i.operation4();
    }

    public void depend5(Interface3 i) {
        i.operation5();
    }
}

 

上一篇:类如何实现具有相同方法的两个接口


下一篇:设计模式(一)