呵呵,标题显得有点大额。最近老转载别人的文章,觉得自己也该拿出点原创的来才行。我在公司近期的项目中,有用到state pattern的,上网google了下,发现大多数文章介绍的都不算太清楚,所以这里谈下本人的理解,通俗易懂。

State pattern 又叫状态模式。为什么会出现这样一种设计模式呢???下面我给你一一道来。项目中有这种需求:一个出差申请(以btripApplication对象定义),要经过多个审批人(approver)审批通过,该出差申请才能通过,并且在每个审批人处理时会执行多种操作(同意,拒绝等),该btripApplication的状态(status)都会有所变化。初步设计如下:

Service层:

  创建btripServiceImpl.java,其中还有的方法大致有:

public void  approve(BtripApplication btripapplication){}同意该申请

public void   reject(BtripApplication btripapplication){}拒绝该申请

public void   cancle(BtripApplication btripapplication){}取消该申请

 

…………

 

每个approver approve时,都会调用approve()方法。在该方法里大致的处理为:更改btripApplication状态(不同的approver处理其状态会不一样,并且其逻辑会有点复杂),发送邮件等等。同理approver进行其他操作时,设计到btrpApplication的状态改变时都会在相应的方法里处理。 也许你会说这样也没什么的。但是在实际的项目中,一个approver approve时,要处理的事情很多很多,而且会随着当前系统登录角色的不同,其处理也将不同。如果要坚持在每个approver调用的方法里,处理btripApplication状态改变的逻辑,其程序间的耦合性将增加(在很多方法里都有状态改变的逻辑),我们要尽量 降低程序间的耦合性,而不是相互依赖。为此才引入了设计模式。一个btripApplication的状态图为:(大概)

其中方框为btripApplication状态,引出的线条为该状态时可以做出的操作。

((图片在附件中))

以面向对象思绪去看该图,可以把btripApplication的每一个status看作一个类(如:diraftStatus.java),该类具有一些行为(如:doCancle(),doApprov()).具体调用该类的某些行为,可以为该类传入一些事件。并可以为每个status类创建一个共用接口(接口在于设计和应用变得简单)。 这样就可以把btripApplication status改变时做 的大部分逻辑,放到这些状态类里实现呢。大大降低了程序间的耦合性。

举个简单例子,在实际应用中可以对这些类进行可充。

Public interface btripApplicationState
{
  Public void execute(int event);
}
 
Public void DraftStatus implements btripApplicationState {
Public void execute(int event){
   Switch(event){
   Case BtripApplicationsEvent.APPROVE:
      doApprove();
      breaik;
  case BtripApplicationsEvent.Cancle:
      doReject();
      break;
    
}
}
   Public void doApprove(){
  ………………
}
Public void doReject(){
 …………………….
}
}