设计模式之状态模式--实现主体与判断逻辑间的解耦

一、前言

这几次写的博客感觉质量不是太好,主要的表现是大家的关注度比较低啊,写这个博客就是想在学习的过程中和大家多多的交流,对于那些懵懂的同学抛下砖头,可是这点也没有做好,个人还是很惭愧的,在这里借此机会向大家提出一点点请求,希望大家看完博客后有什么建议都可以提出来,帮助我改进嘛,毕竟还有其它同学会看,提意见的同时其实也帮助了其它同学,先谢谢大家了。

二、状态模式之场景

状态模式是我们的系统设计中经常用到的设计模式了,主要作用是实现对状态的封装,很多人看到这句话都很不解,其实在我理解看来,与其说它是对特征的封装,还不如说它是对状态对应特定动作的封装;说白了就是当对象方法中逻辑判断的封装(这种逻辑判断必须和对象的当前状态相关),例如:一个关于人的类People,它有一个方法叫haul(),方法输出的是这个人大叫的内容,但是这个大叫的内容依据当前这个人的状态而定,当这个人处于高兴状态的时候他会叫“我好高兴”,当为沮丧的状态时,他会叫“我好伤心”,当他痛苦的时候,他会叫“我好痛苦”。

三、状态模式前的土鳖方法

直接贴出土鳖代码如下:

public class People {

	int state;
	
	public void haul(){
		
		if(state == 0){			//高兴态
			System.out.println("我好高兴");
		}else if(state == 1){	//沮丧态
			System.out.println("我好伤心");
		}else if(state == 2){	//痛苦态
			System.out.println("我好痛苦");
		}
	}

}

设想,我们的代码已经完成了,但是我们需要为People加入新的状态(幸福状态),针对这个“幸福”状态我需要修改haul中代码,嘿,如果你还记得开闭原则的话,就应该反思自己的这种做法(这一切都基于一个前提:我们需要改变People的状态)。

四、使用状态模式吧

有什么办法来改变上述结构同时还能满足开闭原则呢?很简单,我们只需要把需要改变的部分抽取出来,也就是我们需要封装该方法的各个输出部分。我们第一步需要做的是定义一个State的接口,该接口给出了hual的接口,然后针对不同的状态实现该接口,而在People中则不直接实现haul的代码,而是利用他所依赖的State对象来实现。下面给出状态模式的代码。

public interface State {
	
	public void haul();
}

接下来针对各个不同的状态实现State接口

public class HappyState {
	
	public void haul(){
		System.out.println("我好高兴");
	}
}
public class DepressedState {
	
	public void haul(){
		System.out.println("我好伤心");
	}
}
public class PainState {
	
	public void haul(){
		System.out.println("我好痛苦");
	}
}

实现了这么多不同状态下的hual动作,全都是为了使得People的代码更加具有可扩展性,既然有了State接口,我们为什么不面向接口编程呢?

public class People {

	State state;
	
	public State getState() {
		return state;
	}

	public void setState(State state) {
		this.state = state;
	}

	public void haul(){
		
		state.haul();
	}

}

这样以来,不管日后我们想给People加多少个状态,都不需要再改变People的代码了。


五、心得

学习需要坚持不懈,话虽简单,又有多少个能做到呢?自信来源于“做”。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值