-- 责任链模式Chain of Responsibility(COR) ,该模式构造一系列分别担当不同的职责的类(单一职责)来共同完成一个任务,这些类的对象之间像链条一样紧密相连。
一、优缺点:
优点:
- 分工职责明确。
- 类与类之间的耦合度低
缺点:
- 因为处理时以链的形式在对象间传递消息,因此根据实现方式不同,可能影响处理的速度
二、模式结构
引用官方结构图:
组成(角色) | 作用 |
---|---|
Handler(抽象处理者) | 提供抽象方法,含有对自身的引用 |
ConcreteHandler (具体处理者) | 具体处理者,实现抽象方法 |
Client(客户端) | 客户端调用 |
三、栗子 《汽车零件组装》-汽车框架-汽车底部-汽车轮胎
1、Handler 处理抽象类 - CarParts汽车零件 (对自身的引用)
package com.behavior.cor;
/**
* @Description: 抽象处理者
* @Author: ziHeng
* @Date: 2018/8/12 5:53 PM
*/
public abstract class CarParts{
//对自身的引用
protected CarParts carParts;
public void setNextHandle(CarParts carParts){
this.CarParts = carParts;
}
public abstract void nextHandle();
}
2、ConcreteHandler 具体处理者
(1)、汽车框架
package com.behavior.cor;
/**
* @description: 汽车框架
* @author: ziHeng
* @create: 2018-08-12 15:00
**/
public class Framework extends CarParts {
@Override
public void nextHandle() {
System.out.println("拼装框架");
if(carParts!=null){
carParts.nextHandle();
}
}
}
(2)、汽车底部
package com.behavior.cor;
/**
* @description: 汽车底部
* @author: ziHeng
* @create: 2018-08-12 15:00
**/
public class Bottom extends CarParts{
@Override
public void nextHandle() {
System.out.println("拼装底部");
if(carParts!=null){
carParts.nextHandle();
}
}
}
(3)、汽车轮胎
package com.behavior.cor;
/**
* @description: 汽车轮胎
* @author: ziHeng
* @create: 2018-08-12 15:00
**/
public class Tire extends CarParts{
@Override
public void nextHandle() {
System.out.println("拼装轮胎");
if(carParts!=null){
carParts.nextHandle();
}
}
}
调用Test类:
package com.behavior.cor;
/**
* @description: 责任链模式
* @author: ziHeng
* @create: 2018-08-12 14:50
**/
public class corTest {
public static void main(String[] args) {
//汽车外框
CarParts framework = new Framework();
//汽车底部
CarParts bottom = new Bottom();
//轮胎
CarParts tire = new Tire();
//设置
framework.setNextHandle(bottom);
bottom.setNextHandle(tire);
framework.nextHandle();
}
}
学到这里:博主突然思考这个模式与控制反转(IOC)有什么关联。
依赖倒置(DIP)、依赖注入(DI)、控制反转(IoC)
Ioc 传送门: https://www.zhihu.com/question/23277575
控制反转(IOC)的思想最核心的地方在于:资源不由使用资源的双方管理,而由不使用资源的第三方管理
这可以带来很多好处,例如:
- 资源集中管理,实现资源的可配置和易管理。
- 降低了使用资源双方的依赖程度,也就是我们说的耦合度。
个人观点(小白观点):
1、模式用到了依赖倒置原则(DIP),A:高低层的模块(客户端调用拼装顺序决定了高低层)和B:具体实现(汽车零件的具体实现)都依赖于抽象。
依赖倒置原则:
A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。
B.抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
2、也用到了依赖注入(DI),栗子里通过注入汽车零件对象,从而决定下一步的组装的对象。
3、至于控制反转(IOC),博主修炼不足,无法看出依赖注入(DI)与控制反转(IOC)之间的区别。
控制反转(IOC)与依赖注入(DI)区别 传送门: https://blog.csdn.net/guojin08/article/details/74295296