# 小试牛刀之责任链模式

小试牛刀之责任链模式

 一直想写点东西,但是每次都会“懒癌”发作,只说不做,感觉要在懒癌的世界里了此残生了~~昨天在电影里看到一句话:"作对的事情什么时候都不算迟",所以还是决定做点什么,于自己,于梦想,于生活,毕竟生活不只有眼前的苟且,还有梦想与编程!
 前段时间在整理有关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();
    this.initWithGFOneDayEventHandleFactory ();
}

/*存储处理器的集合*/
private LinkedList 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);
以上是基本流程,不足之处,虚心接受指导;
- **

你可能感兴趣的:(设计模式)