`

《设计模式》实战---状态模式(State Pattern)

 
阅读更多
《设计模式》实战---状态模式(State Pattern)


状态模式是比较简单的设计模式之一,是一种很好的复用代码的方式(代码复用的方式:继承和组合,在继承关系确定的情况下,如果想动态改变对象的状态,就只能使用组合)。

状态模式就是通过组合来达到动态更改对象状态的目的。直接上代码,下面主要是person和person state两个接口以及对应的实现。

package com.yan.mode;

public interface Person {
	
	void changeState();
	void run();
}


package com.yan.mode;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class PersonImpl implements Person {

	private PersonState state = new Sleep();
	
	private Random random = new Random(100);
	private List<PersonState> stateList;
	PersonImpl(){
		if (null == stateList) 
			stateList = new ArrayList<PersonState>();
		
		stateList.add(new Sleep());
		stateList.add(new Study());
		stateList.add(new Work());
	}
	
	@Override
	public void changeState() {
		PersonState old = state;
		while(old == state)
			state = stateList.get(random.nextInt(stateList.size()));
		System.out.println("===state has been changed====");
	}

	@Override
	public void run() {
		state.run();

	}
	public static void main(String[] args) {
		Person person = new PersonImpl();
		person.run();
		for (int i = 0; i < 10; i++) {
			person.changeState();
			person.run();
		}
	}
}

package com.yan.mode;

public interface PersonState {

	void run();//接口中方法自动为public static
	
}

package com.yan.mode;

public class Sleep implements PersonState {

	@Override
	public void run() {
		System.out.println("I am sleeping");
	}

}

package com.yan.mode;

public class Study implements PersonState{

	@Override
	public void run() {
		System.out.println("I am studying");
		
	}

}

package com.yan.mode;

public class Work implements PersonState {

	@Override
	public void run() {
		System.out.println("I am working");
	}

}



个人感觉不要为了学习设计模式而学习设计模式!只有真正用到解决实际问题才能领悟到其带来的好处!为了便于大家实验验证,附件提供了本文程序源代码。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics