zoukankan      html  css  js  c++  java
  • 移动架构-状态模式

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

    角色

    环境(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();
    	}
    }
    
  • 相关阅读:
    网络编程
    面向对象总结
    面象对象编程(选课系统)
    类的魔法方法和部分单例模式
    简易3D开发,ThingJS之大道至简
    ThingJS参与3D众创,一起建设“实体中国”!
    ThingJS:轻松让空间“立起来”,展示你的3D创造力
    一个产品的状态不好?ThingJS来找茬
    ThingJS提供有地理位置的信息弹窗示例
    一次灵感盛宴,ThingJS推出场景Market
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664618.html
Copyright © 2011-2022 走看看