坦克大战状态模式+单实例实现实现

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

当前:单实例  状态模式

关联:状态模式-电控门-java

模式价值:

1性能价值:提高效率,保证只创建一个对象。

2机能价值:对该对象从操作都作用在一个对象上,这是机能需要。

需求

动作  走状态  停状态 动作后状态
走行 不动作  走行 进入=>走行状态
停止  走行    不动作  进入=>停止状态
发射  辅助瞄准 精准瞄准   状态不变

测试用例

步骤 规格
初始化 停状态
停止 不动作 
发射  精准瞄准
走行  走行   
发射  辅助瞄准
走行  不动作
停止 停止 

类图

1.标准类图

       状态模式

       单实例模式

2.本实例类图

坦克大战状态模式+单实例实现实现_第1张图片

代码解析 

坦克大战状态模式+单实例实现实现_第2张图片

代码

js实现

java实现

class Function{
	public String mStr;
	Function(String str){
		mStr = str;
		exe();
	}
	public void exe() {
		System.out.println(mStr);
	}
};

// 坦克
interface IStateTank{
	//走
	void run();
	//停
	void stop();
	//射击
	void shot();
}
// 上下文
interface IContext{
	void changeState(IStateTank state);
	void run();
	void stop();
	void shot();
}
///* abstract *//////////////////////////////////////
abstract class State implements IStateTank{
	IContext mContext;
	protected State(IContext c) {
		mContext = c;
	}
}
///* Concrete *//////////////////////////////////////
class RunStae extends State{
	static IStateTank mStateTank = null;
	private RunStae(IContext c) {
		super(c);
	}
	public void run() {
		new Function("机能不运行:走行==走行");
	}
	public void stop() {
		mContext.changeState(StopStae.getRunState(mContext));
		System.out.println("变更:走行=>停止");
	}
	public void shot() {
		new Function("辅助瞄准");
	}
	static IStateTank getRunState(IContext c) {
		if(mStateTank == null) {
			mStateTank = new RunStae(c);
		}
		return mStateTank;
	}
}
class StopStae extends State{
	static IStateTank mStateTank = null;
	private StopStae(IContext c) {
		super(c);
	}
	public void run() {
		new Function("走行机能运行");
		mContext.changeState(RunStae.getRunState(mContext));
		System.out.println("变更:停止=>走行");
	}
	public void stop() {
		new Function("机能不运行:停止==停止");
	}
	public void shot() {
		new Function("精准瞄准");
	}
	public static IStateTank getRunState(IContext c) {
		if(mStateTank == null) {
			mStateTank = new StopStae(c);
		}
		return mStateTank;
	}
}
class ContextTank implements IContext{
	IStateTank mState;
	public ContextTank(){
		mState = StopStae.getRunState(this);	
	}
	public void changeState(IStateTank state) {
		mState = state;
	}
	public void run() {
		mState.run();
	}
	public void stop() {
		mState.stop();
	}
	public void shot() {
		mState.shot();
	}
}
class A{
	static A ma;
	static public A get() {
		return ma;
	}
}
public class Client {
	public static void main(String[] args) {
		System.out.println("hello worldff !");
		
		ContextTank tank = new ContextTank();
		tank.stop();
		tank.shot();
		tank.run();
		tank.shot();
		tank.run();
		tank.stop();
	}
}

运行结果

坦克大战状态模式+单实例实现实现_第3张图片

说明

状态模式中state类Context类间的关系可以有多种处理方式,这里采用了单实例的方式来实现。

因为单实例没有什么太多可说的,即使+线程等各种情况,这也就是个需求而已。

没有太多的设计价值可体现,所以就在这里运用了一下作为举例了。

关于该模式如个设计的现成还有很多控制的细节,不过那都是结合其他知识对该模式的运用,就模式而言,这篇应该够了。

如果对其他的感兴趣,如下是一篇不错的文章。

https://www.cnblogs.com/carryjack/p/7668169.html

补充C#单件实现

类图

坦克大战状态模式+单实例实现实现_第4张图片

代码

using System;

namespace 单实例模式
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            Program p = new Program();
            p.main();
            Console.ReadLine();
        }
        private void main() {
            Singleton singleton_a = Singleton.Instance();
            Singleton singleton_b = Singleton.Instance();
            Console.WriteLine("设置   singleton_b 的SigeltonData为:5");
            singleton_b.SingletonOperation(5);
            Console.WriteLine("设置后 singleton_a 的SigeltonData为:" + singleton_a.GetSigeltonData());
        }
    }

    class Singleton
    {
        private static Singleton uniqueInstance = new Singleton();
        private int singletonData = 0;
        public int GetSigeltonData()
        {
            return singletonData;
        }
        // 实例化
        public static Singleton Instance()
        {
            return uniqueInstance;
        }
        // 单件的动作
        public void SingletonOperation(int data)
        {
            singletonData = data;
        }
    }
}

运行结果

 

你可能感兴趣的:(设计模式-坦克大战-java)