定义:
又称状态对象模式,该对象允许一个对象在其内部状态改变时改变其行为。
当一个对象内部状态改变时允许改变其行为,这个对象看起来向改变了其类型。
状态模式的核心就是封装,状态的变更引起行为的变动,从外部看就好像该对象对应的类发生改变一样。
角色:
-
抽象状态:频道,封装环境对象的一个特定状态所对应的行为
-
具体状态:CCTV1,实现环境的一个状态所应对的行为
-
环境:电视,定义客户端需要的接口,负责状态的转换。会保留一个具体状态的实例,该对象给出环境对象的现有状态
优点:
- 结构清晰
- 遵循设计原则
- 封装性好
缺点:
- 子类太多,不容易管理
效果:
- 在上一篇博客的访问者模式中已经用到
- 多态性原则时状态模式的核心
- 避免了大量的条件转换语句
场景:
- 对象的行为依赖于所处的状态,即行为随状态改变而改变的场景
- 对象在某个方法里依赖于一重或多重条件分支语句
实例:看电视
package 状态模式;
public interface TV {
public void display();
}
package 状态模式;
public class CCTV1 implements TV{
@Override
public void display() {
// TODO 自动生成的方法存根
System.out.println("欢迎收看中央一套");
}
}
package 状态模式;
public class CCTV2 implements TV{
@Override
public void display() {
// TODO 自动生成的方法存根
System.out.println("欢迎收看中央二套");
}
}
package 状态模式;
public class CCTV3 implements TV{
@Override
public void display() {
// TODO 自动生成的方法存根
System.out.println("欢迎收看中央三套");
}
}
package 状态模式;
public class Channel {
private TV c1= new CCTV1();
private TV c2= new CCTV2();
private TV c3= new CCTV3();
private TV CCTV ;
public void setTV(TV tv) {
this.CCTV = tv;
}
public void show1() {
this.setTV(c1);
this.CCTV.display();
}
public void show2() {
this.setTV(c2);
this.CCTV.display();
}
public void show3() {
this.setTV(c3);
this.CCTV.display();
}
}
package 状态模式;
public class Main {
public static void main(String []args) {
Channel channel = new Channel();
channel.show1();
channel.show2();
channel.show3();
}
}
欢迎收看中央一套
欢迎收看中央二套
欢迎收看中央三套