一个很有用的辅助类 -- 门槛类实现

门(槛)是个很有特点的事物,只要它没有上锁,你一推就进。如上了锁,你就要先开了锁才能进。如果很不幸的这个门有多把锁,就要把上面所有的锁都打开才行。

下面我们就来用c#实现门(槛)类:

一、分析

门类:它有个状态--开着/关闭,有人会说那用一个bool变量不就行了。 NO No,我这个门是可以上锁的,而且上锁的数量是不限的。第把锁都只有用对应的key的才能打开。 所以我这个是只要上一把锁就是关上了;要打开的话,却要解开所有已加在这个门上的锁。当然有时候你也可破门而入。这是不是和bool变量不一样呢。门这样的特性是很有用的,尤其是在游戏编辑逻辑中会常常被用到。

二、代码

/*
 * 描术:
 *
 * 作者:AnYuanLzh
 * 时间:2014-xx-xx
 */
using System;
using System.Collections.Generic;

/// <summary>
/// 门类:
/// 它有个状态--开着/关闭,有人会说那用一个bool变量不就行了。
/// NO No,我这个门是可以上锁的,而且上锁的数量是不限的。第把锁都只有用对应的key的才能打开。
/// 所以我这个是只要上一把锁就是关上了;要打开的话,却要解开所有已加在这个门上的锁。
/// 这是不是和bool变量不一样呢。门这样的特性是很有用的,尤其是在游戏编辑逻辑中会常常被用到。
/// </summary>
public class Lzh_Door
{
	List<string> keys;

	/// <summary>
	/// 构造一扇门
	/// </summary>
	public Lzh_Door()
	{
		keys = new List<string> ();
	}

	/// <summary>
	/// 判断这个门是不是开的
	/// </summary>
	/// <value><c>true</c> if this instance is open; otherwise, <c>false</c>.</value>
	public bool IsOpen
	{
		get
		{
			if(keys==null || keys.Count==0)
			{
				return true;
			}
			return false;
		}
	}

	/// <summary>
	/// 这个门上有多少把锁
	/// </summary>
	/// <value>The lock count.</value>
	public int LockCount
	{
		get
		{
			if(keys == null)
				return 0;
			return keys.Count;
		}
	}

	/// <summary>
	/// 给这个门上一把锁
	/// 并返回一个key,用这个key可以解除你的这把锁
	/// </summary>
	public string AddLock()
	{
		string key = System.Guid.NewGuid().ToString();
		if(keys==null)	keys = new List<string>();
		keys.Add (key);
		return key;
	}

	/// <summary>
	/// 开锁
	/// 用你上锁时反回给的key,才能打开你之前上的锁
	/// </summary>
	/// <param name="key">Key.</param>
	public void OpenLock(string key)
	{
		if(keys!=null && keys.Contains(key))
		{
			keys.Remove(key);
		}
	}

	/// <summary>
	/// 强制开门
	/// 这是一种暴力手段,它会毁掉还门上所有的锁
	/// </summary>
	public void FoceOpenDoor()
	{
		keys.Clear ();
	}
}

三、测试Demo

大家看了上面的代码,是觉得很简单呢,一目了然,简单实用。demo,有时间再写一个吧....

时间: 2024-10-11 04:40:28

一个很有用的辅助类 -- 门槛类实现的相关文章

WCF技术剖析之三十:一个很有用的WCF调用编程技巧[下篇]

原文:WCF技术剖析之三十:一个很有用的WCF调用编程技巧[下篇] 在<上篇>中,我通过使用Delegate的方式解决了服务调用过程中的异常处理以及对服务代理的关闭.对于<WCF技术剖析(卷1)>的读者,应该会知道在第7章中我通过类似于AOP的方式解决了相似的问题,现在我们来讨论这个解决方案. 通过<服务代理不能得到及时关闭会有什么后果?>的介绍,我们知道了及时关闭服务代理的重要意义,并且给出了正确的编程方式.如果严格按照上面的编程方式,就意味着对于每一个服务调用,都要

WCF技术剖析之三十:一个很有用的WCF调用编程技巧[上篇]

原文:WCF技术剖析之三十:一个很有用的WCF调用编程技巧[上篇] 在进行基于会话信道的WCF服务调用中,由于受到并发信道数量的限制,我们需要及时的关闭信道:当遇到某些异常,我们需要强行中止(Abort)信道,相关的原理,可以参考我的文章<服务代理不能得到及时关闭会有什么后果?>.在真正的企业级开发中,正如我们一般不会让开发人员手工控制数据库连接的开启和关闭一样,我们一般也不会让开发人员手工去创建.开启.中止和关闭信道,这些工作是框架应该完成的操作.这篇文章,我们就来介绍如果通过一些编程技巧,

UIViewAdditions(一个很方便使用的工具类吧)

我们在工程中,或多或少的要修改控件的坐标-宽度-高度,于是,经常性的见到大家self.view.frame.origin.x,self.view.frame.size.width.........相当的麻烦,在这里向大家推荐一个比较好的工具类,是UIView的类目,它里面对于求坐标,求高度什么的做了封装,很方便大家调用. @下载链接:点击这里 @.h #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interfa

.Net一个很有用的帮助类,包含获取获取浏览器版本号、 获取操作系统版本号、获取客户端IP地址、取客户端真实IP、获取公网IP、判断是否是IP格式

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.Threading.Tasks;using System.Web; namespace ZC.Common.Log{    class UserHelper    { #region 获取浏览器版本号 /// <summary>   

UIView自动调整控件(一个很方便使用的工具类吧)

镔哥自己仿照其他类重写的工具类,我们在工程中,或多或少的要修改控件的坐标-宽度-高度,于是,经常性的见到大家self.view.frame.origin.x,  self.view.frame.size.width.........相当的麻烦, 在这里向大家写一下的工具类,是UIView的类目,它里面对于求坐标,求高度什么的做了封装,很方便大家调用. #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interfa

一个很实用的前端框架Zui

杰哥给我推荐了一个很有用的前端框架-Zui,我看着觉得很神奇的,因为有很多我都不懂.在这里分享总结一下.首先,这是一个中国自己开发的框架,比起很多外国的框架来说,有很详细的API,而且是全中文的,不需要再经过其他人的翻译了.然后,它的内容十分丰富,很系统的分为了:基础,控件,组件,JS插件,视图几大块:而且使用起来,只需要导入js,在适当的地方加上正确的class类就可以了.对于,没有什么js基础的人,也是十分容易上手的.下面我就大体的介绍一下它的各个模块的功能.基础:基础里面我觉得很有用的主要

java android布局里的控件值 反射绑定给实体类,实体类绑定给控件,表单提交绑定很有用

注意了:根据实际情况,添加实体里字段的类型,控件类型的判断才可使用.这里控件只有TextView EditText 实体类字段只有String int类型,带值的控件添加tag ,值和实体类的字段值一致 package ice.ui.service; import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import jav

Unix / 类 Unix shell 中有哪些很酷很冷门很少用很有用的命令?(转)

著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:孙立伟 链接:http://www.zhihu.com/question/20140085/answer/14107336 来源:知乎 这个问题quora上有人提过 What are some lesser known but useful Unix commands? ,已经有不少答案了,我个人已经从这些答案中学到不少,这里我只是照搬过来,然后加上自己的解释. lsof: 列出所有打开的文件.举例:'lsof -p

EF错误:无法加载关系xxx,因为类型xxx不可用。以下信息对于解决上一个错误可能很有用: 类型xxx中不存在必需属性xxx

工作中遇到下面错误: 指定的架构无效.错误: 无法加载关系“Centria.ABATracker.Domain.FK_ABC_TherapySession_SessionId”,因为类型“Centria.ABATracker.Domain.TherapySession”不可用. 以下信息对于解决上一个错误可能很有用: 类型“Centria.ABATracker.Domain.TherapySession”中不存在必需属性“SessionTargetTARecord”. 无法加载关系“Centri