跳至主要內容

设计模式-行为型-状态模式

引领潮流小于 1 分钟设计模式archive

1、定义

状态模式:允许一个对象在其内部状态改变时改变它的行为

写法

public interface ITvStatus {
    public void nextChannel();
    public void prevChannel();
    public void turnUp();
    public void turnDown();
}

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

public class PowerOffState implements ITvStatus{
    @Override
    public void nextChannel() {
        System.out.println("----------");
    }

    @Override
    public void prevChannel() {
        System.out.println("----------");
    }

    @Override
    public void turnUp() {
        System.out.println("----------");
    }

    @Override
    public void turnDown() {
        System.out.println("----------");
    }
}

public class PowerOnState implements ITvStatus {

    @Override
    public void nextChannel() {
        System.out.println("下一频道");
    }

    @Override
    public void prevChannel() {
        System.out.println("上一频道");
    }

    @Override
    public void turnUp() {
        System.out.println("调高音量");
    }

    @Override
    public void turnDown() {
        System.out.println("调低音量");
    }

}

public class TVController implements ITvStatus,IPowerController{

    private ITvStatus mTvStatus = new PowerOffState();

    public void setmTvStatus(ITvStatus mTvStatus) {
        this.mTvStatus = mTvStatus;
    }

    @Override
    public void powerOn() {
        setmTvStatus( new PowerOnState() );
        System.out.println("开机");
    }

    @Override
    public void powerOff() {
        setmTvStatus( new PowerOffState() );
        System.out.println("关机");

    }

    @Override
    public void nextChannel() {
        mTvStatus.nextChannel();
    }

    @Override
    public void prevChannel() {
        mTvStatus.prevChannel();
    }

    @Override
    public void turnUp() {
        mTvStatus.turnUp();
    }

    @Override
    public void turnDown() {
        mTvStatus.turnDown();
    }
}

/**
 * 状态模式
 * 行为是平行关系,不可替换,自我状态改变
 */
public class TestMain {

    public static void main(String[] args){

        TVController tvController = new TVController();
        tvController.nextChannel();
        tvController.powerOff();
        tvController.powerOn();
        tvController.turnDown();

    }
}

代码示例

https://github.com/yinlingchaoliu/23-design-pattern