还用if--else?

今天是11月4日是2006下半年全国计算机技术与软件专业技术资格(水平)考试简称软考
我是考软件设计师的,考的情况就不说了---这个跟下文无关
在下午题的最后一题给我很大的启发,看下文应该能知道答案了---
我觉的出这到题的作者肯定是面向对象设计的高手.---
题目我有点忘了但是我就是凭记忆想想--如果没有猜错的话状态图

题目大概意思:
因为差差原因要设计一个Door有click,complete,timeout行为在之间
在考试有他们的状态的转化图.
但是今天我讲的重点不是行为的多少就用一个来讲吧
那我就简化题目来讲吧
首先 看下图---大家是不是觉的很简单呀
还是以DOOR为例他有两个行为就是click ,complete--重点以click

看到上图大家也许和我一样写的下面的程序;

  public   class  Door
{
 
private final int OPEN=1;
 
private final int OPENING=2;
 
private final int CLOSED=3
 
private final int CLOSING=4;
 
private int state=closed;
 
public void setState(int state)

  
this.state=state;
}

 
public void  click()
 
{  
 
if(state==OPEN) setState(COLSEING)  ;
    
  
else if(state==CLOSED) setState(OPENING)
     

 }

public void  complete()
{
…….
…..

 }

}


今天看到考试的题目让我清楚的知道
面向对象原来可以这样的—让if—else 判断消失
这个就是好像一个武侠小说能飞就不想用走来快速的行使
可以达到同样的目的
当然有的人认为我用if—else不是很好写起来简单又好看又易懂写的又快
这个表现为初学者的心里(--当然我也是初学者)但是你又没有看到或者想到
如果if—else很多的时候你看的容易吗//

让我们来分析一下这个例子我们把一每个状态抽象成一个类得到下图:这个就是用的类的多态行性,根据Door的属性State的不断变化对应的状态类的也随之改

变这样他门调用的同样的方法的实现的功能的就不一样的,

这样就可以达到动态调用就可以和if--else一样的功能

实现的代码:


 

public   class  Door 

public final DoorState CLOSED = new DoorClosed(this); 
public final DoorState OPENING = new DoorOpening(this); 
public final DoorState OPEN = new DoorOpen(this); 
public final DoorState CLOSING = new DoorClosing(this); 
public final DoorState STAYOPEN = new DoorStayOpen(this); 
private DoorState state = CLOSED; //设置传输门当前状态
 public void setState(DoorState state)
this.state = state; }
 
public void getState()
//根据当前状态输出对应的状态字符串 
System.out.println(state.getClass().getName()); }
 
public void click(){ state.click() ;}//发生click事件时进行状态转换 
complete(){
{
  state.complete();
 }

}


DoorState
----

public abstract DoorState

 
protected Door door;
 
public DoorState(Door door)
  
{   this.door=door;}
 
public abstract void click();
 
public abstract void complete();
 }




 DoorOpen
---


public  DoorOpen extends DoorState
{
  
public DoorOpen(Door door)
 
{
   
super(door);
  }

 
public void click()
 
{
    door.state
=door.OPENING;
  }


}


DoorClosed
----
public  DoorClosed extends DoorState
{
  
public DoorOpen(Door door)
 
{
   
super(door);
  }

 
public void click()
 
{
    door.state
=doorCLOSING;
  }


}


..... 
 

下面的类多差不多就不多写了
 

 

 


 

最后总结:将if else用在小地方还可以,如简单的数值判断;但是如果按照你的传统习惯思维,在实现业务功能时也使用if else,那么说明你的思维可能需要重塑,你的编程经验越丰富,传统过程思维模式就容易根深蒂固,想靠自己改变很困难;建议接受专业头脑风暴培训。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值