状态模式

来源:互联网 发布:微信js获取地理位置 编辑:程序博客网 时间:2024/05/21 01:44

《android设计模式》读书笔记,便于以后复习,如有侵权,请尽快与我联系删除,谢谢


一。定义
  状态模式中的行为是有状态来决定的,不同的状态下有不同的行为。状态模式和策略模式的结构几乎一样,但是目的和本质不同。状态模式的行为是平行的,不可替换的,策略模式的行为是彼此独立,可相互替换的。即,状态模式吧对象的行为包装再不同的状态对象里,每一个状态对象都由一个共同的抽象状态基类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。
  当一个对象的内在状态改变时允许改变其行为,这个对象看见起来像是改变了其类
二。使用场景
  (1)一个对象的行为决定于它的状态,并且它必须在运行时根据状态改变它的行为。
  (2)代码中包含大量与对象状态有关的条件语句,且这些分支依赖于该对象的状态。
  状态模式将每一个条件分支放入一个独立的类中,这使客户端可以根据对象自身情况将对象的状态作为一个对象,这个对象可以不依赖其他对象而独立变化,这样通过多态来去除过多的,重复的if...else等分支语句。
三。代码实现
**********************************************************************************************
package com.yinazh.designpattern;

public interface TVState{
public void nextChannel();
public void preChannel();
public void turnUp();
public void turnDown();
}

public class PowerOffState implements TVState{
public void nextChannel(){}
public void preChannel(){}
public void turnUp(){}
public void turnDown(){}
}

public class PowerOnState implements TVState{
public void nextChannel(){
System.out.println("next Channel");
}
public void preChannel(){
System.out.println("pre Channel");
}
public void turnUp(){
System.out.println("turn up volume");
}
public void turnDown(){
System.out.println("turn down volume");
}
}

public interface PowerController{
public void powerOn();
public void powerOff();
}

public TVController implements PowerController{
TVState mTVState;
public void setState(TVState mTVState){
this.mTVState = mTVState;
}
public void powerOn(){
setState(new PowerOnState());
System.out.println("power on");
}
public void powerOff(){
setState(new PowerOffState());
System.out.println("power off");
}

public void nextChannel(){
mTVState.nextChannel();
}

public void preChannel(){
mTVState.preChannel();
}

public void turnUp(){
mTVState.turnUp();
}

public void turnDown(){
mTVState.turnDown();
}
}

public class Client{
public static void main(String[] args){
TVController tvController = new TVController();
tvController.powerOn();
tvController.nextChannel();
tvController.powerOff();
}
}
**********************************************************************************************
上述,有2个状态,在开机状态下,操作可以执行,在关机状态下,不做任何处理。
状态模式将行为封装到状态类中,在进行操作时将这些功能转发给状态对象,不同状态下有不同的实现。
四。总结
  状态模式的关键点在于不同的状态下对于同一行为有不同的响应。
优点:状态模式将所有与一个特定的状态相关的行为都放入一个状态对象中,它提供了一个更好的方法来组织与特定状态相关的代码,将繁琐的状态判断转换成结构清晰的状态类族,在避免代码膨胀的同时也保证了扩展性和可维护性。
缺点:使用状态模式必然会增加系统类和对象的个数。

0 0
原创粉丝点击