行为型模式(Behavioral Pattern)是对不同的对象之间划分责任和算法的抽象化;
行为型模式共有11种:
■ 模板方法模式
■ 命令模式
■ 责任链模式
■ 策略模式
■ 迭代器模式
■ 中介者模式
■ 观察者模式
■ 备忘录模式
■ 访问者模式
■ 状态模式
■ 解释器模式
一、状态模式的简介
■ 状态模式(State Pattern)又称为状态对象模式;
■ 当一个对象内在状态改变时允许改变行为,这个对象看起来像改变了其类型;
状态模式的核心是封装,状态的变更引起行为的变动,从外部看来就好像该对象对应的类发生改变一样;
![](https://img.haomeiwen.com/i10861568/6d134c7edf082ba6.png)
image.png
状态模式3个角色:
■ 抽象状态(State)角色:
该角色用以封装环境对象的一个特定状态所对应的行为;
■ 具体状态(Concrete State)角色:
该角色实现环境的一个状态所对应的行为;
■ 环境(Context)角色:
该角色定义客户端需要的接口,并负责具体状态的切换;
它会保留一个具体状态类的实例,该实例给出环境对象的现有状态;
/**
* 抽象状态角色
*/
public abstract class State {
// 定义一个环境角色
protected Context context;
// 设置环境
public void setContext(Context context) {
this.context = context;
}
// 抽象行为
public abstract void handle();
}
/**
* 环境角色
*/
public class Context {
// 定义状态
public static State STATE1 = new ConcreteState1();
public static State STATE2 = new ConcreteState2();
// 当前状态
private State currentState;
// 获取当前状态
public State getCurrentState() {
return currentState;
}
// 设置当前状态
public void setCurrentState(State currentState) {
this.currentState = currentState;
currentState.setContext(this);
}
// 行为委托
public void handle1(){
// 切换到状态1
this.setCurrentState(STATE1);
this.currentState.handle();
}
public void handle2(){
// 切换到状态2
this.setCurrentState(STATE2);
this.currentState.handle();
}
}
/**
* 具体状态1
*/
public class ConcreteState1 extends State{
// 状态1的行为逻辑处理
@Override
public void handle() {
System.out.println("状态1的行为逻辑处理");
}
}
/**
* 具体状态2
*/
public class ConcreteState2 extends State{
// 状态2的行为逻辑处理
@Override
public void handle() {
System.out.println("状态2的行为逻辑处理");
}
}
/**
* 场景应用程序
*/
public class Client {
public static void main(String[] args){
// 定义环境角色
Context context = new Context();
// 执行行为
context.handle1();
context.handle2();
}
}
# 控制台输出:
状态1的行为逻辑处理
状态2的行为逻辑处理
二、状态模式的优缺点
状态模式的优点:
■ 结构清晰;
■ 遵循设计原则;
■ 封装性非常好;
状态模式的缺点:
■ 子类太多,不易管理;
三、状态模式的实例
# 使用状态模式模拟电视频道切换的过程;
![](https://img.haomeiwen.com/i10861568/122c6b3d5c0def3f.png)
image.png
/**
* 电视频道
*/
public interface Channel {
void display();
}
/**
* 电视机
*/
public class TV {
public final static Channel CCTV1 = new CCTV1();
public final static Channel CCTV2 = new CCTV2();
public final static Channel CCTV3 = new CCTV3();
private Channel channel;
public void setChannel(Channel channel) {
this.channel = channel;
}
/**
* 播放CCTV1频道
*/
public void disCCTV1(){
this.setChannel(CCTV1);
this.channel.display();
}
/**
* 播放CCTV2频道
*/
public void disCCTV2(){
this.setChannel(CCTV2);
this.channel.display();
}
/**
* 播放CCTV3频道
*/
public void disCCTV3(){
this.setChannel(CCTV3);
this.channel.display();
}
}
/**
* 频道 CCTV1
*/
public class CCTV1 implements Channel{
@Override
public void display() {
System.out.println("CCTV1 新闻联播");
}
}
/**
* 频道 CCTV2
*/
public class CCTV2 implements Channel{
@Override
public void display() {
System.out.println("CCTV2 经济半小时");
}
}
/**
* CCTV3
*/
public class CCTV3 implements Channel{
@Override
public void display() {
System.out.println("CCTV3 非常6+1");
}
}
/**
* 测试类
*/
public class Test {
public static void main(String[] args){
TV tv = new TV();
tv.disCCTV1();
tv.disCCTV2();
tv.disCCTV3();
}
}
# 控制台输出:
CCTV1 新闻联播
CCTV2 经济半小时
CCTV3 非常6+1
参考:
摘录 《设计模式(Java版)》韩敬海主编;(微信读书APP中有资源,可以直接阅读)
网友评论