兄弟们好,今天我们来学习一下状态设计模式。
它的定义是:「一个对象在不同的状态可以显示不同的动作,比如,在公司我们是打工人,在家里我们是老公,在教室我们是老师,因为我们的所处的环境不同而导致我们拥有不同的动作行为。这就是状态设计模式。」
我们在日常学习中这种状况很常见,比如TCP
连接建立和销毁的过程,从不同的状态进行迁移,而表现出来的动作也不相同,又如一个线程的的状态,从五个状态不断地切换。
我们来看一下它的类图实现
通过TCPConnection
状态的不断改变,引发其State
状态的改变,因而导致其输出的结果改变。
我们来看一下它的角色组成:
Context
,用户使用的对象,内部保存有该对象的状态State
,该对象的状态的抽象描述ConcreteState
,对象状态的具体描述
接下来我们来看一下它的代码实现:
「Context
」
class TCPConnection{
private State state ;
public TCPConnection(State state){
this.state = state ;
}
public void open(){
state.open();
}
public void close(){
state.close();
}
}
「State
状态描述」
interface State{
void open();
void close();
}
「具体的状态描述」
代码语言:javascript复制class TCPEstablished implements State{
@Override
public void open() {
System.out.println("当前状态为正在建立连接状态");
}
@Override
public void close() {
}
}
class TCPListened implements State{
@Override
public void open() {
System.out.println("当前状态为监听状态");
}
@Override
public void close() {
}
}
class TCPClosed implements State{
@Override
public void open() {
System.out.println("当前状态为关闭状态");
}
@Override
public void close() {
}
}
看完上面的代码,兄弟们是不是感觉状态设计模式就是一个解决选择语句的过程,因为不同的行为而产生不同的动作,这难道不就是我们常见的if|switch
嘛
if("established".equals(tcpConnection.state)){
}else if("listened".equals(tcpConnection.state)){
}else if("cloesed".equals(tcpConnection.state)){
}
我一手if|else
不香嘛,搞那么麻烦干嘛,好啦,兄弟们该说出那句话了,「方便扩展,设计模式往往会将一个问题复杂化,进行结构的拆分,但随着业务的不断扩大,它的好处也会出现,方便维护和扩展。」
好啦,兄弟们。今天的设计模式就到这里了,兄弟们,晚安。明天也是美好的一天呢!!!