• 移动架构-状态模式


    当一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。又称状态对象模式,状态模式是对象的行为模式

    角色

    环境(Context)角色:上下文:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个定义了对象的当前状态
    抽象状态(State)角色:定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为
    具体状态(ConcreteState)角色:每一个具体状态类都实现了环境(Context)的一个状态所对应的行为

    使用场景

    1. 一个对象的行为取决于他的状态,并且他必须在运行时根据状态改变他的行为
    2. 代码中包含大量与对象相关的条件语句,例如一个操作中含有多分支语句。这些分支历来与该对象
    3. 状态模式将每一个条件分支放入一个独立类中,这使得你可以根据对象自身的情况将状态作为一个对象。这一对象可以不依赖于其他对象而独立变化。这样通过过多的,重复的if-else分支语句

    理解实例

    首先有一个环境角色

    public interface TvState {
    	public void nextChannel();
    	public void preChannel();
    	public void turnOn();
    	public void turnOff();
    }
    

    抽象状态角色

    public class PowerOffState implements TvState{
    
    	@Override
    	public void nextChannel() {
    		System.out.println("下一个频道,无效");
    	}
    
    	@Override
    	public void preChannel() {
    		System.out.println("上一个频道,无效");
    	}
    
    	@Override
    	public void turnOn() {
    		System.out.println("开机,有效");
    	}
    
    	@Override
    	public void turnOff() {
    		System.out.println("关机,无效");
    	}
    }
    
    public class PowerOnState implements TvState{
    
    	@Override
    	public void nextChannel() {
    		System.out.println("下一个频道,有效");
    	}
    
    	@Override
    	public void preChannel() {
    		System.out.println("上一个频道,有效");
    	}
    
    	@Override
    	public void turnOn() {
    		System.out.println("开机,无效");
    	}
    
    	@Override
    	public void turnOff() {
    		System.out.println("关机,有效");
    	}
    }
    

    具体状态角色

    public class TvControl {
    	
    	TvState tvState;
    	
    	public void setState(TvState tvState) {
    		this.tvState = tvState;
    	}
    	
    	public void powerOn() {
    		setState(new PowerOnState());
    		System.out.println("开机");
    	}
    	
    	public void powerOff() {
    		setState(new PowerOffState());
    		System.out.println("关机");
    	}
    	
    	public void nextChannel() {
    		tvState.nextChannel();
    	}
    
    	public void preChannel() {
    		tvState.preChannel();
    	}
    
    	public void turnOn() {
    		tvState.turnOn();
    	}
    
    	public void turnOff() {
    		tvState.turnOff();
    	}
    }
    
  • 相关阅读:
    Supervisor
    JS操作JSON总结
    电脑连接海信电视 HDMI
    upupw nginx服务器 rewrite设置
    PHP实现远程图片下载
    web页面调用IOS的事件
    composer更新不成功,启用国内镜像网站的配置更改办法
    Oracle中的一连接语句
    Oracle 树操作(select…start with…connect by…prior)
    MyEclipse下Tomcat无法部署项目 finish按钮无法点击
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664618.html
Copyright © 2020-2023  润新知