为什么要学设计模式呢?就像建房子要学建筑一样,其实设计模式就是从建筑学上产出的,学了建筑可以建出好看的房子,学设计模式自然是为了写出优美的代码。
这篇文章主要记录一下设计模式的基础,后续会对23种设计模式分别学习,并会在我的**github**上分享学习过程种产出的源码。
设计模式的目的
- 代码重用性(相同功能的代码,不用多次编写);
- 可读性(代码规范性,便于其他程序员阅读和理解);
- 可扩展性(增加新的功能时非常方便);
- 可靠性(增加新的功能对原有功能没有影响);
- 使程序呈现出高内聚、低耦合的特性。
单一职责原则
对于类来说,一个类应该只负责一项职责。它的核心就是控制类的粒度大小、将对象解耦、提高其内聚性。
接下来直接用代码说明:
package com.mezjh.blog.designpattern.principle.singleresponsibility;
/**
* @author ZJH
* @date 2020/9/24 15:40
*/
public class Demo1 {
public static void main(String[] args) {
new Animal().moveMethod("猫咪");
new Animal().moveMethod("金鱼");
new Animal().moveMethod("小鸟");
}
}
/**
* 动物类
*/
class Animal {
/**
* 动物的移动方式 有天上飞、地上跑、水里游的
* 故违反单一职责原则 解决方案如Demo2 根据不同动物创建不同的类
* @param name
*/
public void moveMethod(String name) {
System.out.println(name + "在地上跑");
}
}
这个类违反了单一职责原则,它定义的moveMethod()方法不能涵盖所有动物的移动方式。
package com.mezjh.blog.designpattern.principle.singleresponsibility;
/**
* 该设计虽然遵循了单一职责原则 但其分解成本较高 类较多
* 解决方案如 Demo3 修改Demo1 将其分为三个方法
* @author ZJH
* @date 2020/9/24 15:46
*/
public class Demo2 {
public static void main(String[] args) {
new LoadAnimal().moveMethod("猫咪");
new WaterAnimal().moveMethod("金鱼");
new AirAnimal().moveMethod("小鸟");
}
}
class AirAnimal {
/**
* 天上飞的动物
* @param name
*/
public void moveMethod(String name) {
System.out.println(name + "在天上飞");
}
}
class LoadAnimal {
/**
* 地上跑的动物
* @param name
*/
public void moveMethod(String name) {
System.out.println(name + "在地上跑");
}
}
class WaterAnimal {
/**
* 水里游的动物
* @param name
*/
public void moveMethod(String name) {
System.out.println(name + "在水里游");
}
}
这一个类看似解决了Demo1的问题,但其改动较大,将一个类分解成了三个类。
package com.mezjh.blog.designpattern.principle.singleresponsibility;
/**
* 没有做大的修改 在类级别上没有遵循单一职责原则
* 但在方法级别上遵守了单一职责原则
* @author ZJH
* @date 2020/9/24 15:52
*/
public class Demo3 {
public static void main(String[] args) {
new AnimalPlus().moveInAir("小鸟");
new AnimalPlus().moveInLoad("猫咪");
new AnimalPlus().moveInWater("金鱼");
}
}
class AnimalPlus {
public void moveInAir(String name) {
System.out.println(name + "在天上飞");
}
public void moveInLoad(String name) {
System.out.println(name + "在地上跑");
}
public void moveInWater(String name) {
System.out.println(name + "在水里游");
}
}
这个类是基于Demo1的更改,虽其在类层面上违反了单一职责原则,但其在方法层面上依然遵守单一职责原则。
来看看单一职责原则的优点:
- 降低类的复杂度;一个类只负责一项原则,逻辑简单。
- 提高类的可读性;逻辑简单当然可读啦。
- 提高系统的可维护性;可读性提高,自然就可维护了。
- 变更引起的风险降低。修改某一功能时,可以降低对其他功能的影响。
接口隔离原则
要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口。客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。
未完