《大话设计模式》阅读笔记和总结。原书是C#编写的,本人用Java实现了一遍,包括每种设计模式的UML图实现和示例代码实现。
目录:设计模式
Github地址:DesignPattern
说明
定义:状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
UML图:
代码实现:
State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为。
abstract class State{
public abstract void Handle(Context context);
}
ConcreteState类,具体状态。每一个子类实现一个与Context的一个状态相关的行为。
class ConcreteStateA extends State {
@Override
public void Handle(Context context) {
context.setState(new ConcreteStateB());
}
}
class ConcreteStateB extends State {
@Override
public void Handle(Context context) {
context.setState(new ConcreteStateA());
}
}
Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态。
class Context{
private State state;
// 定义Context的初始状态
public Context(State state){
this.state = state;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
System.out.println("当前状态:"+state);
}
// 对请求做处理,并设置下一状态
public void Request(){
state.Handle(this);
}
}
客户端代码
public class StatePattern {
public static void main(String[] args){
Context context = new Context(new ConcreteStateA());
context.Request();
context.Request();
context.Request();
context.Request();
}
}
运行结果
当前状态:com.shijc.dp.state.ConcreteStateB@4554617c
当前状态:com.shijc.dp.state.ConcreteStateA@74a14482
当前状态:com.shijc.dp.state.ConcreteStateB@1540e19d
当前状态:com.shijc.dp.state.ConcreteStateA@677327b6
示例
例子:程序员的一天往往是比较固定的,上午的时候精神百倍,中午饿了犯困,需要午休;下午精神还不错,如果能准时下班必是极好的;但是如果加班到晚上,傍晚比较疲惫,如果加班到很晚,那就困极了睡着了。用程序模拟这个过程。
UML图:
代码实现:
抽象状态类,定义一个抽象方法"写程序"
public abstract class WorkState {
public abstract void WriteProgram(Work w);
}
上午工作状态
public class ForenoonState extends WorkState {
@Override
public void WriteProgram(Work w) {
if (w.getHour()<12){
System.out.println("当前时间:"+ w.getHour()+"点 上午工作,精神百倍");
}else {
w.setState(new NoonState());
w.WriteProgram();
}
}
}
中午工作状态
public class NoonState extends WorkState {
@Override
public void WriteProgram(Work w) {
if (w.getHour()<13){
System.out.println("当前时间:"+ w.getHour()+"点 饿了,犯困,午休");
}else {
w.setState(new AfternoonState());
w.WriteProgram();
}
}
}
下午工作状态
public class AfternoonState extends WorkState {
@Override
public void WriteProgram(Work w) {
if (w.getHour()<17){
System.out.println("当前时间:"+ w.getHour()+"点 下午状态还不错,继续努力");
}else {
w.setState(new EveningState());
w.WriteProgram();
}
}
}
晚上工作状态
public class EveningState extends WorkState {
@Override
public void WriteProgram(Work w) {
if (w.isFinish()){
w.setState(new RestState());
w.WriteProgram();
}else {
if (w.getHour()<21){
System.out.println("当前时间:"+ w.getHour()+"点 加班哦,疲累至极");
}else {
w.setState(new SleepingState());
w.WriteProgram();
}
}
}
}
睡眠工作状态
public class SleepingState extends WorkState {
@Override
public void WriteProgram(Work w) {
System.out.println("当前时间:"+ w.getHour()+"点 不行了,睡着了");
}
}
下班状态
public class RestState extends WorkState {
@Override
public void WriteProgram(Work w) {
System.out.println("当前时间:"+ w.getHour()+"点 下班回家了");
}
}
工作类
public class Work {
private WorkState current;
public Work(){
//工作初始化为上午工作状态,即上午9点开始上班
current = new ForenoonState();
}
// 钟点属性,状态转换的依据
private double hour;
// 任务完成属性
private boolean finish;
public double getHour() {
return hour;
}
public void setHour(double hour) {
this.hour = hour;
}
public boolean isFinish() {
return finish;
}
public void setFinish(boolean finish) {
this.finish = finish;
}
public void setState(WorkState state){
current = state;
}
public void WriteProgram(){
current.WriteProgram(this);
}
}
客户端代码
public class Main {
public static void main(String[] args){
Work emergencyProjects = new Work();
emergencyProjects.setHour(9);
emergencyProjects.WriteProgram();
emergencyProjects.setHour(10);
emergencyProjects.WriteProgram();
emergencyProjects.setHour(12);
emergencyProjects.WriteProgram();
emergencyProjects.setHour(13);
emergencyProjects.WriteProgram();
emergencyProjects.setHour(14);
emergencyProjects.WriteProgram();
emergencyProjects.setHour(17);
emergencyProjects.setFinish(false);
emergencyProjects.WriteProgram();
emergencyProjects.setHour(19);
emergencyProjects.WriteProgram();
emergencyProjects.setHour(22);
emergencyProjects.WriteProgram();
}
}
运行结果
当前时间:9.0点 上午工作,精神百倍
当前时间:10.0点 上午工作,精神百倍
当前时间:12.0点 饿了,犯困,午休
当前时间:13.0点 下午状态还不错,继续努力
当前时间:14.0点 下午状态还不错,继续努力
当前时间:17.0点 加班哦,疲累至极
当前时间:19.0点 加班哦,疲累至极
当前时间:22.0点 不行了,睡着了