坦克大战状态模式应用举例(c++ java c# js)

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

当前:单实例  状态模式

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

模式价值:

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();
	}
}

运行结果

说明

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

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

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

关于该模式如果涉及到线程还有很多控制的细节,不过那都是结合其他知识对该模式的运用,就模式而言,这篇应该够了。

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

JAVA设计模式之单例模式(单件模式)—Singleton Pattern - CarryJack - 博客园

补充C#单件实现

类图

单件模式

代码

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;
        }
    }
}

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值