欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【设计模式】(二十九)--行为型模式--状态模式

程序员文章站 2022-04-13 22:44:40
...

【设计模式】(二十九)–行为型模式–状态模式

状态模式定义

Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.

意思是:当一个对象内在状态改变时允许改变行为,这个对象看起来像改变了其类型。
对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。
状态模式基于以下三个元素:

  • State 抽象状态类,封装了一个状态和状态对应的行为接口。
  • Concrete State 具体状态类,实现了行为接口。
  • Context 环境类,定义了外部需要的接口,持有一个状态对象,并且负责切换具体的状态以及行为调用。

状态模式的优点

  • 1、封装了转换规则。
  • 2、枚举可能的状态,在枚举状态之前需要确定状态种类。
  • 3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。
  • 4、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。 5、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。

但是使用状态模式会产生很多子类,不易管理。

状态模式的使用场景

  • 1、行为随状态改变而改变的场景。
  • 2、条件、分支语句的代替者。

状态模式的简单实现

类图
【设计模式】(二十九)--行为型模式--状态模式
实现

public class Test {
    public static void main(String[] args) {
        TV tv = new TV();
        tv.start();
        tv.changeDFTV();
        tv.changeZJTV();
        tv.changeHNTV();
    }
}
/**
 * 电视
 */
public class TV {
    private final static Channel ZJTV = new ZJTV();
    private final static Channel DFTV = new DFTV();
    private final static Channel HNTV = new HNTV();

    private Channel channel;

    public void setChannel(Channel channel) {
        this.channel = channel;
    }

    public void changeZJTV() {
        System.out.println("切换节目");
        this.setChannel(ZJTV);
        this.channel.display();
    }

    public void changeDFTV() {
        System.out.println("切换节目");
        this.setChannel(DFTV);
        this.channel.display();
    }

    public void changeHNTV() {
        System.out.println("切换节目");
        this.setChannel(HNTV);
        this.channel.display();
    }

    public void start() {
        System.out.println("开机,初始节目");
        Channel initChannel = HNTV;
        this.setChannel(initChannel);
        this.channel.display();
    }
}
/**
 * 频道
 */
public interface Channel {
    /**
     * 展示节目
     */
    void display();
}
/**
 * 湖南卫视
 */
public class HNTV implements Channel {
    @Override
    public void display() {
        System.out.println("湖南卫视:我是歌手!");
    }
}
/**
 * 浙江卫视
 */
public class ZJTV implements Channel {
    @Override
    public void display() {
        System.out.println("浙江卫视:奔跑吧!兄弟!");
    }
}
/**
 * 东方卫视
 */
public class DFTV implements Channel {
    @Override
    public void display() {
        System.out.println("东方卫视:极限挑战");
    }
}

结果
【设计模式】(二十九)--行为型模式--状态模式