Java设计模式之状态模式

一、定义
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
二、角色
 1 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。

 2 抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。

3 具体状态(Concrete State):实现抽象状态定义的接口。
三、以电视机开关控制为例,写一个demo
1、抽象状态

package com.example.state;
/**
 * 抽象状态类
 * @author zeng
 *
 */
public interface TVState {
    //开机
    public void turnOn();
    //关机
    public void turnOff();
    //下一个频道
    public void nextChanel();
    //上一个频道
    public void preChanel();

}

2.具体状态1

package com.example.state;

public class PowerOn implements TVState {

    @Override
    public void turnOn() {
        System.out.println("开机");

    }

    @Override
    public void turnOff() {
        System.out.println("关机");
    }

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

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

}

3、具体状态2

package com.example.state;

public class PowerOff implements TVState {

    @Override
    public void turnOn() {
        System.out.println("开机");

    }

    @Override
    public void turnOff() {
        System.out.println("关机");

    }

    @Override
    public void nextChanel() {
        System.out.println("请先开机");
    }

    @Override
    public void preChanel() {
        System.out.println("请先开机");
    }

}

4、上下文环境,在此处是一个状态控制的管理器

package com.example.state;

public class TVControl {
    private TVState tvState;
    private TVState turnOn,turnOff;

    public TVControl() {
        turnOn = new PowerOn();
        turnOff = new PowerOff();

    }

    public void turnOn() {
        tvState = turnOn;
        tvState.turnOn();

    }

    public void turnOff() {
        tvState = turnOff;
        tvState.turnOff();

    }

    public void nextChanel() {
        tvState.nextChanel();

    }

    public void preChanel() {
        tvState.preChanel();

    }



}

5、客户类

package com.example.state;

public class Client {

    public static void main(String[] args) {
        TVControl tvControl = new TVControl();
        tvControl.turnOn();
        tvControl.turnOff();
        tvControl.nextChanel();
        tvControl.turnOn();
        tvControl.preChanel();

    }

}

打印结果

开机
关机
请先开机
开机
上一个频道
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值