设计模式之状态模式

一情景

   在日常工作中,我们都应该会遇到找工作的问题,找工作肯定是要经过面试,面试通过以后才会被公司录用。面试的流程一般都是,经过好几轮面试,第一轮面试完了以后进入第二轮面试,二轮面试,然后是第三轮面试,直到面试结束。这个流程程一般都是一步步的来完成的 每当进入哪个状态就会在根据当前的状态做出不同的行为,如果对这个流程用代码实现。代码如下

public       class  M  {
public  void  goMianShi(String state){//根据状态判断当前正在进行的是那个一个流程
if(state=="一轮面试"){
System.out.println("进行一轮面试");
}else if(state=="二轮面试"){ 
System.out.println("进行二轮面试");
} else if(state=="三轮轮面试"){
System.out.println("进行三轮轮面试");
}
else if(state=="面试结束"){
System.out.println("面试结束");
}

}

客户端代码

  public static void main(String[] args) {

String state="二轮面试";//假设现在面试的状态是 该进入二轮面试,
new M().goMianShi(state);//根据不同的状态做出不同的行为

}

      客户端有一个当前面试的状态,进入面试行为判断的时候会判断当前状态做出不同的行为。

      这样做有个问题,如果判断题是一个很大的分支是不是写起来很麻烦,写起来也容易出错,而且如果我要加一个分支的话,岂不是要改代码,这个违背了开放封闭原则,这个类本身是违背单一原则的,因为不管是什么状态都会改变这个类的行为,就是会打印不同的东西,每次state的改变都会导致class M有不同的行为改变,比如第一次:一轮面试,打印第一轮面试,第二次是:二轮面试,打印第二轮面。如何来做不会违背这个两个原则?

二状态模式

       这里我想到了状态模式,让这个面试的行为依赖面试状态,就是对当前不同的行为看做是一个类一个对象,每一个对象都只有一种行为,而对于每一个对象来说只能有一个行为来改变他,如果添加某一个行为就需要增加一个类。这样就不会违背单一和封闭原则了。

    状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。(意思就是一个类里面内在状态改变了,行为也会随之改变,看起来就像这个类被改变了一样)

状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂的情况。把状态逻辑判断移到表示不同状态的一些了类中,可以把复杂的判断罗建简单化。


针对上面的面试的逻辑我么可以这么实现,首先不管是到了哪个环节,都有一个共同的行为就是面试,可以把这个行为抽象出来,

public   abstract    class  M  {
 
public abstract void mianShi(People p);

}

然后是具体的环节:环节一

public       class  M1 extends M {
 
public  void mianShi(People p){
if(p.sate=="一轮面试"){
System.out.println("一轮面试");
}else{
System.out.println("恭喜你一轮面试完成,进入二轮面试");
new M2().mianShi(p); 
}
}

}

环节二

public       class  M2 extends M {
 
public  void mianShi(People p){
if(p.sate=="二轮面试"){
System.out.println("二轮面试");
}else{
System.out.println("恭喜你二轮面试完成,进入三轮面试");
new M3().mianShi(p); 
}
}

}

环节三
public       class  M3 extends M {
 
public  void mianShi(People p){
if(p.sate=="三轮面试完成"){
System.out.println("三轮面试");
}else{
System.out.println("恭喜你三轮面试完成,面试结束");
new M4().mianShi(p);
}
}

}

环节四

public       class  M4 extends M {
public  void mianShi(People p){
System.out.println("面试结束");
}

}


来了一个面试者代码如下:

public      class  People  {
public String  sate;//面试状态
public M  m;//
public People(){
   if(m==null){//面试初始化状态,第一次面试
    m=new M1();
   }
}
public  void   goMianShi(){
m.mianShi(this);
}

}

客户端代码

People  p=new People();
p.sate="二轮面试";//当前进行第二次面试

p.goMianShi();

      我每次改变的是people 的内在状态state,改变的也只有goMianShi()这个行为。

     这样做既把复杂的逻辑分散到不同行为的子类中。每次改变people 的面试状态的时候就会改变其行为,这个行为只有goMianshi(),但是却做出不同的行为表现。看起来就像改变了people类一样。

三 策略模式和状态模式的区别  

       想到

      策略这模式:调用哪一种决策有调用者即客户端来决定,相当于调用哪个算法, 客户端只需要new 那个算法类 并交给contex就行。

     状态模式:客户端只能提供一个状态,系统会根据得到的状态,自己选择调用哪个算法类。就像面试过程一样如果状态为“二轮面试”,在第一轮面试的类里面 会自动去new M2 并且调用M2  面试方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值