zoukankan      html  css  js  c++  java
  • 【设计模式】行为型08状态模式(status Pattern)

    状态模式(status Pattern)

          定义:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(Objects for States)。与命令模式称为兄弟模式。

           简单来说,状态模式就是通过对象的状态来改变其行为,博主凭借模糊的记忆,简单还原一下许久之前看过的《大话设计模式》一书中的例子(这本书中的demo特别精致,推荐一读):

           类图:老毛病,以后画(美名曰日后复习)


           代码:

    1、状态的接口所有状态接口继承此类:

    package com.pat.status;
    /**
     * 状态接口
     * @author ZX
     */
    public interface Status {
    	public void writeProgram(Work work);
    }
    

    2、状态实现类,这里定义了上午中午下午三个子状态:

    package com.pat.status;
    /**
     * 状态1,上午的状态
     * @author Administrator
     *
     */
    public class MorningStatus implements Status{
    
    	@Override
    	public void writeProgram(Work work) {
    		if(work==null) {return;}
    		if(work.getHour()<=12) {//小于12点
    			System.out.println("当前"+work.getHour()+"点,做上午工作");
    		}else {//大于12点进入中午的状态
    			work.setCurrerntStatus(new NoonStatus());
    			work.doWork();
    			
    		}
    		
    	}
    
    }
    


    package com.pat.status;
    /**
     * 状态2:中午的状态
     * @author Administrator
     *
     */
    public class NoonStatus implements Status{
    
    	@Override
    	public void writeProgram(Work work) {
    		if(work==null) {return;}
    		if(work.getHour()<=13) {//小于1点
    			System.out.println("当前"+work.getHour()+"点,休息");
    		}else {//大于1点进入中午的状态
    			work.setCurrerntStatus(new AfternoonStatus());
    			work.doWork();
    			
    		}
    		
    	}
    
    }
    


    package com.pat.status;
    /**
     * 状态3:下午的状态
     * @author Administrator
     *
     */
    public class AfternoonStatus implements Status{
    
    	@Override
    	public void writeProgram(Work work) {
    		if(work==null) {return;}
    		if(work.getHour()<=18) {//小于18点
    			System.out.println("当前"+work.getHour()+"点,下午工作");
    		}else {//大于18点进入中午的状态
    			System.out.println("干毛线,下班了还干");
    			
    		}
    		
    	}
    }
    

    3、工作类:

    package com.pat.status;
    /**
     * 工作类
     * @author ZX
     *
     */
    public class Work {
    	private int hour;
    	private boolean isFinshed;
    	private Status currerntStatus;
    	
    	
    	//constructor
    	public Work() {
    		//设置初始状态-早上的状态
    		this.currerntStatus= new MorningStatus();
    	}
    	public void doWork() {
    		currerntStatus.writeProgram(this);
    	}
    	
    	
    	
    	
    	public int getHour() {
    		return hour;
    	}
    	public void setHour(int hour) {
    		this.hour = hour;
    	}
    	public boolean isFinshed() {
    		return isFinshed;
    	}
    	public void setFinshed(boolean isFinshed) {
    		this.isFinshed = isFinshed;
    	}
    	public Status getCurrerntStatus() {
    		return currerntStatus;
    	}
    	public void setCurrerntStatus(Status currerntStatus) {
    		this.currerntStatus = currerntStatus;
    	}
    	
    	
    	
    	
    	
    	
    }
    

    4、测试:

    package com.pat.status;
    
    public class Test {
    	public static void main(String[] args) {
    		Work work = new Work();
    		//当前9点
    		work.setHour(9);
    		work.doWork();
    		//当前13点
    		work.setHour(13);
    		work.doWork();
    		work.setHour(16);
    		work.doWork();
    		work.setHour(20);
    		work.doWork();
    	}
    }
    







         











  • 相关阅读:
    Django项目:CRM(客户关系管理系统)--20--12PerfectCRM实现King_admin分页上下页
    Django项目:CRM(客户关系管理系统)--19--11PerfectCRM实现King_admin分页显示条数
    Django项目:CRM(客户关系管理系统)--18--10PerfectCRM实现King_admin日期优化
    Django项目:CRM(客户关系管理系统)--17--09PerfectCRM实现King_admin显示注册表的内容
    Oracle数据库,非空约束、主键约束、外键约束、唯一约束

    Oracle数据库,用户的创建及表的创建
    点击时显示遮罩层,登录时灰色遮罩效果
    多个视频时,利用函数实现播放一个,其他自动暂停
    正则表达式、事件调用
  • 原文地址:https://www.cnblogs.com/the-fool/p/11054145.html
Copyright © 2011-2022 走看看