观察和职责链实现坦克大战(java)

目录:《一个实例讲完23种设计模式》

当前:观察者模式 职责链模 状态模式

需求:坦克大战

创建两种坦克

坦克类型射程速度
b7070米时/70公里
b5050米时/70公里

模式说明

观察者定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。

职责链使多个象都有机会求,从而避免求的送者和接收者之的耦合关系。将成一条,并沿着链传递该请求,直到有一个理它止。

状态模式一个象在其内部状变时它的行。从而使象看起来似乎修改了其行

类图

代码

js实现

c++实现

java实现

// static 
class Function{
	static void shot(int type) {
		exe("射击:"+type);
	}
	static void run(int type) {
		exe("前进:"+type);
	}
	static void exe(String str) {
		System.out.println(str);
	}
} 
// interface
interface ICommandCenter{
	void notifys();
	void attach(ITank t);
	IState getmState();
	void setmState(IState mState);
}
interface ITank{
	void update();
	void setNextTank(ITank t);
	void setCommandCenter(ICommandCenter c);
}
interface IState{
	void exe(int type);
}
// concrete
class Shot implements IState{
	static final Shot mShot = new Shot();
	private Shot() {}
	static Shot get() {
		return mShot;
	}
	public void exe(int type) {
		Function.shot(type);
	}
}
class Run implements IState{
	static final Run mRun = new Run();
	private Run() {}
	static Run get() {
		return mRun;
	}
	public void exe(int type) {
		Function.run(type);
	}
}
class CommandCenter implements ICommandCenter{
	ITank mLastTank = null;
	IState mState;
	public IState getmState() {
		return mState;
	}
	public void setmState(IState mState) {
		this.mState = mState;
	}
	public void notifys() {
		if(mLastTank!=null) {
			mLastTank.update();
		}
	}
	public void attach(ITank t) {
		t.setNextTank(mLastTank);
		mLastTank = t;
		t.setCommandCenter(this);
	}
}
abstract class Tank implements ITank{
	ITank mNextTank;
	IState mState;
	ICommandCenter mCommandCenter;
	int mType;
	public void update() {
		mState = mCommandCenter.getmState();
		mState.exe(mType);
		if(null != mNextTank) {
			mNextTank.update();
		}
	}
	public void setNextTank(ITank t) {
		mNextTank = t;
	}
	public void setCommandCenter(ICommandCenter c) {
		mCommandCenter = c;
	}
}
class B70Tank extends Tank{
	public B70Tank() {
		mType = 70;
	}
}
class B50Tank extends Tank{
	public B50Tank() {
		mType = 50;
	}
}
public class Client {
	public static void main(String[] args) {
		System.out.println("hello world !");
		ICommandCenter c = new CommandCenter();
		c.attach(new B70Tank());
		c.attach(new B50Tank());
		c.attach(new B70Tank());
		c.setmState(Shot.get());
		c.notifys();
		c.setmState(Run.get());
		c.notifys();
	}
}

运行结果

优化前的代码,任何时候优化都等同于消除冗余+结构切割

// static 
class Function{
	static void shot(int type) {
		exe("射击:"+type);
	}
	static void ruan(int type) {
		exe("前进:"+type);
	}
	static void exe(String str) {
		System.out.println(str);
	}
} 
// interface
interface ICommandCenter{
	void notifys();
	void attach(ITank t);
	int getState();
	void setState(int s);
}
interface ITank{
	void update();
	void setNextTank(ITank t);
	void setCommandCenter(ICommandCenter c);
}
// concrete
class CommandCenter implements ICommandCenter{
	ITank mLastTank = null;
	int mState = 0;
	public void notifys() {
		if(mLastTank!=null) {
			mLastTank.update();
		}
	}
	public void attach(ITank t) {
		t.setNextTank(mLastTank);
		mLastTank = t;
		t.setCommandCenter(this);
	}
	public int getState() {
		return mState;
	}
	public void setState(int s) {
		mState = s;
	}
}
abstract class Tank implements ITank{
	ITank mNextTank;
	ICommandCenter mCommandCenter;
	int mType;
	int mState = 0;
	public void update() {
		mState = mCommandCenter.getState();
		exe();
		if(null != mNextTank) {
			mNextTank.update();
		}
	}
	public void setNextTank(ITank t) {
		mNextTank = t;
	}
	public void setCommandCenter(ICommandCenter c) {
		mCommandCenter = c;
	}
	private void exe() {
		if(mState==0) {
			shot();
		}else{
			run();
		}
	}
	private void shot() {
		Function.shot(mType);
	}
	private void run() {
		Function.ruan(mType);
	}
}
class B70Tank extends Tank{
	public B70Tank() {
		mType = 70;
	}
}
class B50Tank extends Tank{
	public B50Tank() {
		mType = 50;
	}
}
public class Client {
	public static void main(String[] args) {
		System.out.println("hello worldff !");
		ICommandCenter c = new CommandCenter();
		c.attach(new B70Tank());
		c.attach(new B50Tank());
		c.attach(new B70Tank());
		c.setState(0);
		c.notifys();
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值