假设state是从数据库中提取出的值 
... 
if(1==state){ 
System.out.println("上班"); 
}else if(2==state){ 
System.out.println("下班"); 
}else if(3==state){ 
System.out.println("加班"); 
}else{ 
System.out.println("没班"); 

...

解决方案 »

  1.   

    switch case不就解决了吗?需要什么设计模式呢
      

  2.   

    感觉也没啥模式的,用枚举写了个public class Test1 {    public static void main(String[] args) {
            showWorkStatus(WorkStatus.ON);
            showWorkStatus(2);
        }
        
        public static void showWorkStatus(WorkStatus status) {
            System.out.println(status.getStatusDesc());
        }
        
        public static void showWorkStatus(int n) {
            WorkStatus[] status = WorkStatus.values();
            for(int i = 0; i < status.length; i++) {
                if(n == status[i].getStatus()) {
                    System.out.println(status[i].getStatusDesc());
                    return;
                }
            }
            System.out.println(WorkStatus.OTHER.getStatusDesc());
        }
    }enum WorkStatus {
        
        OTHER(0, "没班"),
        ON(1, "上班"), 
        OFF(2, "下班"),
        OVERTIME(3, "加班");
        
        private int status;
        private String statusDesc;
        
        WorkStatus(int status, String statusDesc) {
            this.status = status;
            this.statusDesc = statusDesc;
        }    public int getStatus() {
            return status;
        }    public String getStatusDesc() {
            return statusDesc;
        }
    }
      

  3.   

    如果用 JDK 5 以下版本的话,不能用枚举时,可以这样:public class Test1 {    public static void main(String[] args) {
            showWorkStatus(WorkStatus2.ON);
        }
    }class WorkStatus2 {    private int status;
        private String statusDesc;
        
        private WorkStatus2(int status, String statusDesc) {
            setStatus(status);
            setStatusDesc(statusDesc);
        }
        
        public final static WorkStatus2 ON = new WorkStatus2(1, "上班");
        public final static WorkStatus2 OFF = new WorkStatus2(2, "下班");
        public final static WorkStatus2 OVERTIME = new WorkStatus2(3, "加班");
        public final static WorkStatus2 OTHER = new WorkStatus2(0, "没班");        public int getStatus() {
            return status;
        }
        public String getStatusDesc() {
            return statusDesc;
        }
        private void setStatus(int status) {
            this.status = status;
        }
        private void setStatusDesc(String statusDesc) {
            this.statusDesc = statusDesc;
        }
    }
      

  4.   

    晕,Test1 漏了一个方法:    public static void showWorkStatus(WorkStatus2 status) {
            System.out.println(status.getStatusDesc());
        }
      

  5.   

    传参时的状态码最好不要使用数字之类毫无意义的魔法量,可以使用枚举、常量或者是 5 类所用的
    类型安全枚举形式,因为这样可以把一些毫无意义的东西统一进行管理。在方法体内尽量不要出来数字量和字符串量,都应使用上面提到的三种方式中的一种。比如:状态 1 时可以写为 WorkStatus.ON 或者是 WORK_STATUS_ON 这种。
      

  6.   

    如果仅在这个地方用用的话,用 switch...case 足够了,我感觉这个用枚举有点大材小用了,没有什么必要。
      

  7.   

    其一:设计模式的最大优点之一,是复用。此处,已经没有复用的必要了。其二:业务(比如此处的println)比较复杂,需要复用,那么其源头state,仍是需要一段hardcode代码,以便最大程度的减少代码修改。
    (也就是OCP原则啦)
      

  8.   

    把那段抽象出来,写个方法(如果你经常要用到的话)形成复用,我觉得这本身就是设计模式了!如output(String state){
       swithc(state){
            case : .......
      }
    }这样你就可以复用这个方法,并且以后你要是想改变当state=1时的输出的话,你只需改output一处就ok了。ooad 和 设计模式 我是还不能很懂,但我觉得Java现在主要做的应用,所以追求的是复用 和 松耦合。比如你把output()方法的形参用一个类型来封装,如output(A a),这样有一天你要想改变output的行为,你只需改A类,而应用中调ouput(a)的地方都不用修改。其实我觉得这也是松耦合,提高复用的。明白你的意思,其实“小代码”思考好了,也可以发现问题,我们是学习吗。不见得真的要一个巨大项目背景才能谈设计模式。
      

  9.   

    我觉得如果你想看个例子 可以这样写。
    public interface Status{
         public void printStatus();
    }public class WorkStatus implement Status{
          public void printStatus(){
              System.out.println("工作“);
         }
    }//各个状态的类.....public class FreeStatus implement Status{
          public void printStatus(){
              System.out.println("没班“);
         }
    }public classc StatusFactory{
       public static Status getStatus(int i){
           switch(i){
           case 1:
                return new WorkStatus();
           //添加更多。
            case 4:
                return new FreeStatus ();
           }
       }
    }public class TestStatus{
        private Status s ;
        TestStatus(int i){
            s = StatusFactory.getStatus(i);
        }    public print( ){
            s.printStatus();
        }    public static void main(String[] args){
                    TestStatus test = new TestStatus();
                test.print();
        }
    }这个例子中包含了几个简单的设计模式  你可以领悟一下。其实楼上说的都很好。学习可以。少量代码中用这种东西得不偿失的。:)
      

  10.   

    同意12楼。可以使用设计模式中的状态模式来解决此问题。
    问题虽然小,但是也可以用设计模式来指导一下。状态模式简介:抽象状态(State)角色:
        定义一个抽象接口,用以封装环境(Context)对象的一个特定的状态所对应的行为。
    具体状态(ConcreteState)角色:
        每一个具体状态类都实现了环境(Context)对象的一个状态所对应的行为。
    环境(Context)角色:
        定义客户端感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象当前的状态。