设计模式常用的七大原则有:
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) 接口隔离原则
客户端不应该依赖它不需要的接 口,即一个类对另一个类的依赖 应该建立在最小的接口上
上图类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) 类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(); } }