# 小试牛刀之责任链模式
程序员文章站
2024-02-23 10:22:22
...
小试牛刀之责任链模式
一直想写点东西,但是每次都会“懒癌”发作,只说不做,感觉要在懒癌的世界里了此残生了~~昨天在电影里看到一句话:"作对的事情什么时候都不算迟",所以还是决定做点什么,于自己,于梦想,于生活,毕竟生活不只有眼前的苟且,还有梦想与编程!
前段时间在整理有关IM消息接收处理的部分代码时,发现以前使用的环信代码规范性和可读性,包括设计上面都很差,想要去好好整理,却又没有什么好的思路,与老大沟通后,了解到责任链设计模式的优越性,于是马不停蹄的整理完代码,赶紧做一总结,分享请教~~废话不多说,切入正题,直接撸代码,这里以和女朋友的一天为例(当然,在下只是个宅男单身狗!~!)。
-
定义接口
第一步定义接口:
/**- Created by Grenaderose on 2017/11/3.
- 与女朋友一天的事项处理器
- @author Grenaderose [email protected]
*/
public interface IWithGFOneDayEventHandle {
/**- 和女朋友一天要做的事的处理方法
- @param event 和女朋友一天要做的事件对象
*/
void handleEvent(EventWithGF event);
}
-
实现具体的事情
这个是有我们先想好要干嘛!!~~~
定义我们的事件对象
/**- 和女朋友一天要做的
*/
public class EventWithGF{
//事件类型
private int eventType;
/获取事件类型的get方法/
public int getEventType() {
return eventType;
}
/设置事件类型的set方法/
public void setEventType(int eventType) {
this.eventType = eventType;
}
}
- 和女朋友一天要做的
-
事件的类型宏定义
/**- 和女朋友一天要做的事的具体类型
*/
public class EventType{
//事件类型
//出去兜风(当然你得有辆车,共享单车不能算啊)
public static final int EVENT_GO_FOR_A_DRIVE=1;
//吃午饭(不要叫外卖啊,要不然你会和我一样的~~)
public static final int EVENT_HAVE_LUNCH=2;
//看电影(提前买好票,问好人家喜欢看什么,别TM到了才问,这就尴尬了。。)
public static final int EVENT_SEE_A_MOVIE=3;
//休息休息(兄弟,你懂我意思吧)
public static final int EVENT_GO_TO_SLEEP=4;
}
*不同事件的处理器
/**- Created by Grenaderose on 2017/11/3.
- 兜风事件的处理器
- @author Grenaderose [email protected]
*/
public class GoForADriveHandle implements IWithGFOneDayEventHandle {
@Override
public void handleMsg(EventWithGF eventWithGF) {
int type= eventWithGF.getEventType();
switch (type){
case EventType.EVENT_GO_FOR_A_DRIVE:{
//todo 去兜风
break;
}
default:{
break;
}
}
}
/** - Created by Grenaderose on 2017/11/3.
- 吃午饭事件的处理器
- @author Grenaderose [email protected]
*/
public class HaveLunchHandle implements IWithGFOneDayEventHandle {
@Override
public void handleMsg(EventWithGF) {
int type= eventWithGF.getEventType();
switch (type){
case EventType.EVENT_HAVE_LUNCH:{
//todo 共享午餐
break;
}
default:{
break;
}
}
}
/** - Created by Grenaderose on 2017/11/3.
- 看电影事件的处理器
- @author Grenaderose [email protected]
*/
public class SeeAMovieHandle implements IWithGFOneDayEventHandle {
@Override
public void handleMsg(EventWithGF e) {
int type= eventWithGF.getEventType();
switch (type){
case EventType.EVENT_SEE_A_MOVIE:{
//todo 去看电影
break;
}
default:{
break;
}
}
}
/** - Created by Grenaderose on 2017/11/3.
*休息事件的处理器 - @author Grenaderose [email protected]
*/
public class GoToSleepHandle implements IWithGFOneDayEventHandle {
@Override
public void handleMsg(EventWithGF) {
int type= eventWithGF.getEventType();
switch (type){
case EventType.EVENT_GO_TO_SLEEP:{
//todo 去休息
break;
}
default:{
break;
}
}
}
- 和女朋友一天要做的事的具体类型
-
*简单工厂模式对事件进行处理封装
/**- Created by Grenaderose on 2017/11/3.
- 管理消息处理器的工厂
- @author Grenaderose [email protected]
*/
public class WithGFOneDayEventHandleFactory {
/*对象单例*/
private static volatile WithGFOneDayEventHandleFactory instance;
/**
* 向外提供获取实例的公共方法
*/
public static WithGFOneDayEventHandleFactory getInstance() {
if (instance == null) {
synchronized (WithGFOneDayEventHandleFactory .class) {
if (instance == null) {
instance = new WithGFOneDayEventHandleFactory ();
}
}
}
return instance;
}
/**
* 私有构造
*/
private WithGFOneDayEventHandleFactory () {
//初始化工厂配置
this.handleList = new LinkedList<IWithGFOneDayEventHandle>();
this.initWithGFOneDayEventHandleFactory ();
}
/*存储处理器的集合*/
private LinkedList<IWithGFOneDayEventHandle> handleList;
/**
* 初始化处理器的工厂
*/
private void initWithGFOneDayEventHandleFactory () {
//创建处理器对象
//兜风事件的处理器
GoForADriveHandle goForADriveHandle = new GoForADriveHandle ();
//吃饭事件的处理器
HaveLunchHandle haveLunchHandle= new HaveLunchHandle ();
//看电影事件的处理器
SeeAMovieHandle seeAMovieHandle =new SeeAMovieHandle ();
//休息事件的处理器
GoToSleepHandle goToSleepHandle =new GoToSleepHandle ();
//将所有初始化完毕的管理器对象维护进管理器存储集合
this.handleList.add(goForADriveHandle );
this.handleList.add(haveLunchHandle);
this.handleList.add(seeAMovieHandle );
this.handleList.add(goToSleepHandle );
}
/**
*事件到来时的链式管理
* @param eventWithGF 事件对象
*/
public void handleMsg(EventWithGF eventWithGF) {
for (IWithGFOneDayEventHandle implHandle : this.handleList) {
implHandle .handleEvent(eventWithGF);
}
}
}
- 每当事件来临时我们只需要调用
WithGFOneDayEventHandleFactory .getInstance().handleMsg(eventWithGF);
以上是基本流程,不足之处,虚心接受指导;
- **
上一篇: docker小试牛刀之mysql