【设计模式】(二十九)--行为型模式--状态模式
程序员文章站
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("东方卫视:极限挑战");
}
}
结果
上一篇: idea开发环境基本设置
下一篇: iOS开发笔记 -- 自动化打包