`
tigers20010
  • 浏览: 47142 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java设计模式之精通state pattern

阅读更多

如果大家对文章内容有不理解的地方,尽情留言或QQ(1357208561) 讨论。让大家共同进步。

 

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

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

Service层:

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

public void  approveBtripApplication btripapplication{}同意该申请

public void   rejectBtripApplication 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(){

 …………………….

}

}

 

 

 

 

                 

  • 描述: btripApplication status picture
  • 大小: 6.7 KB
1
1
分享到:
评论
1 楼 kensunhu 2012-06-14  
兄弟啊,你只开了个头,有点虎头蛇尾的。能把这个CASE的设计类图给出就好了。

相关推荐

Global site tag (gtag.js) - Google Analytics