状态模式
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类
就是需要3个东西 一个状态State 很多继承State状态的子类。不同状态不同的效果。 还有一个环境,就是当前状态
每一个状态就是一个对象,是一个类。环境Context类中创建对象State。作为构造参数传入其子类作为初始状态。
在每个子类中可以做判断。什么样的事情变成其他的子类。因为State的方法中传入的环境Context。里面可以定义其他的,比如时间,作判断的东西
在State方法中判断传入的环境Context的属性为什么。然后可以设置其State属性为对应的子类。
客户端中可以不断调用。
具体代码
State
abstract class State{
public abstract void Handle(Context context);
}
两个继承State的子类
//继承State状态类
class ConcreateA extends State{
@Override
public void Handle(Context context) {
// TODO Auto-generated method stub
//在这个里设置改变状态
context.setState(new ConcreateB());
}
}
class ConcreateB extends State{
@Override
public void Handle(Context context) {
// TODO Auto-generated method stub
//在这个里设置改变状态
context.setState(new ConcreateA());
}
}
环境Context,表示初始状态。也需要将其传入State的子类中。好改变状态属性
class Context {
private State state;
public Context(State state){
this.state = state;
}
public State getState() {
System.out.println("当前状态:"+state.getClass().getName());
return state;
}
public void setState(State state) {
this.state = state;
}
public void Request(){
//对请求做处理,并设置下一个状态
state.Handle(this);
}
}
客户端
public static void main(String[] args) {
//创建环境Context对象,传入State一个子类作为初始状态
Context context = new Context(new ConcreateA());
//调用State的方法,设置其属性State状态为另一个子类
context.Request();
//所以获取到的State是B不是A
context.getState();
context.Request();
context.getState();
context.Request();
context.getState();
context.Request();
context.getState();
context.Request();
context.getState();
}
当一个对象的行为取决于他的状态,并且他必须在运行时刻根据状态来改变他的行为时,就可以考虑使用状态模式了。
适配器模式
这个很容易理解
当系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要用于希望复用一些现存的类,但是接口 又与复用环境要求不一致的情况。
像书上说的。需要一个翻译。与外国人交流。我们需要一个翻译来帮助我们交流。
客户需要的接口类型是B 我们自己的接口的类型是C
我们让A继承B ,然后在A中实例化个C。重写B的方法。在其方法中让实例化的C调用方法。
返回的是C的调用的方法。但是类型是B的子类。也就是B
代码:
B
//这个客户需要的
class Target{
public void Request(){
System.out.println("普通请求");
}
}
C
//这个是我们的,需要适配的
class Adaptee{
public void SpecificRequest(){
System.out.println("特殊请求");
}
}
A
//让其继承Target 然后里面实例化个我们需要改变的类
class Adapter extends Target{
Adaptee adaptee = new Adaptee();
@Override
//然后重写客户需要的方法.在那个方法中,让我们创建的类调用方法
public void Request(){
adaptee.SpecificRequest();
}
}
客户端
public static void main(String[] args) {
Adapter adapter = new Adapter();
adapter.Request();
}
适配器不是开始就考虑的,是补救的办法。
适配器还是容易理解。状态模式有些难理解。希望在后面的模式中比较学习能更加理解。
参考
http://www.cnblogs.com/ysw-go/p/5404918.html
http://www.cnblogs.com/java-my-life/archive/2012/06/08/2538146.html