欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

# 小试牛刀之责任链模式

程序员文章站 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);
以上是基本流程,不足之处,虚心接受指导;
- **