摘要:
经典的策略模式如下图所示:让我解释一下这幅图的含义,IContext是上下文的接口类,IStrategy是策略的接口,IStrategy依赖于IContext,也就是IContext里面存有一个IStrategy的策略字段。其实策略模式说白了,就像诸葛亮给刘备的锦囊妙计一样,遇到一种具体的情况,采取一种相应的策略。也就像我们平时会观察天气,根据今天有没有下雨,选择要不要打伞,下雨的话,那么打伞;不下雨就不打伞。下面我们用代码来演示一下经典的策略模式。我们将要做的是,从一个数组中提取一个值,这个值的提取要根据用户的选择,也就是我们要根据用户的选择提取对应的值。假设用户有三种选择,选最大值,最小值 阅读全文
摘要:
介绍本文主要讲解Asp.Net应用程序中的状态管理技术(Asp.Net中有多种状态管理技术),并批判性地分析所有状态管理技术的优缺点。背景HTTP是无状态的协议。客户端发起一个请求,服务器响应完请求后,立即断开。服务器断开后,所有因请求而分配的资源会全部被清除。这些资源包括在请求期间创建的对象,分配的内存等等。Windows应用程序开发者可能会感到很惊讶,因为他没有办法依靠对象和成员变量来跟踪Web应用程序的当前状态。如果我们要跟踪用户在多个页面访问间,或同一页的多个访问间的信息,我们就需要使用由ASP.NET提供的状态管理技术。状态管理是由ASP.NET用以让开发者在相同或不同页面的多个请求 阅读全文
摘要:
由于在数据库连接部分,新建连接的时候一直报“出错原因:超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。”于是,我便想查看一下数据库的活动连接,看看究竟是哪个程序占用了过多的数据库连接。我们可以用sp_who(或sp_who2)来显示所有活动的连接。USE master;GOEXEC sp_who2;GO查询的结果如表1。为了可读性,表1中的结果有删减了一些列和一些行。但删去的内容不影响我们要讲的东西。表1 sp_who2查询的结果从表1中,我们可以看到有很多进程状态(见Status列)显示sleeping,并且当前正在执行的命 阅读全文
摘要:
初学者总是认为代码写好了,把程序给跑起来了,这事就算完了。想象电器商,你就知道绝不是这样的,一件电器卖出去了,那么通常商家还得为我们保修一两年,为他们可能犯的错误买单。写程序也是这样,程序是写好了,但是你犯了的错误不能让用户去解决,我们也不希望用户去解决,因为他们常用的解决方案就是不用你的用别人的。 当错误发生的时候,你需要做这几件事情:1、看以前的代码,问以前写代码的老人(这一步通常不能省,因为你必须要了解业务,才能对软件进行修改)2、你需要搭建一个测试环境。搭建一个测试环境,通常意味着你要为连调相关的软件,这通常是一个比较不好搞的活。因为你可能需要修改其他软件的代码以便适应测试的要求,过后 阅读全文
摘要:
1、顺序结构描述的队列在这一章中,我们选择用Rear队尾的指针来指示最后一个入队的元素在队列中的位置。我们选择队列内存储的数组的Data[0]作为队头,每次取数据的时候,队头弹出(out)。具体的代码如下所示:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DataStructure.Queue{ class SeqQueue: IQueue { int Rear =-1;//队尾 constint MaxSize=100;//队列的最大容量 T[] Data 阅读全文
摘要:
以下都是从友善之臂《04- Tiny6410 Linux开发指南-20111020》复制出来的,我所做的工作就是将友善之臂提供的源程序进行详细注释,另外将一些大函数分解成小函数。这段代码不长,但是涉及到多个比较不容易接触的C语言知识点。说明:armcomtest 是友善之臂为了方便测试而开发的linux 下的简易实用串口终端程 序,它使用标准的系统调用,和硬件无关。一般Linux 系统系统启动后,串口 0,1,2对应的设 备名分别为/dev/ttySAC0,1,2,3 测试串口2 需要借助另一台带有串口的PC,使用我们提供的串口线和扩展小板( 选购 配件) ,连接好 C... 阅读全文
摘要:
栈的定义:栈是限定仅在表尾进行插入和删除的线性表。从栈的定义,我们可以知道栈是线性表的一种特殊情况,与线性表不同,栈中元素的弹出(pop)和压入(push)都只能在栈顶进行,对于我们编程来讲,我们不必考虑是否需要在某个地方插入,某个地方删除。也不必考虑在特殊节点做特别的处理。同线性表相同,栈也可以用数组或者用链表来描述。在栈中,很重要的一个东西就是栈顶,通常我们会用Top来指示栈顶所在的位置,我们可以形象地把栈必成是一叠盘子(如图1),因为盘子是一块块叠上去的,并且要拿到最后一块盘子,你必须先拿起最后一块盘子上面的盘子,这跟栈的特性先进后出一样。其中Top就是用来指向盘子顶(栈顶)的。图1 一 阅读全文
摘要:
我们将在单链表的基础上讨论循环链表的实现,循环链表中的节点node沿用单链表中的节点。循环链表的算法思想基本上与单链表没有什么差异,唯一比较大的差异就是原来我们通过判断node.next==null来判断链表的结束,现在改成判断node.next==Head,因为我们已经把尾节点链接到头节点上,在逻辑上形成循环链表。具体的代码如下所示using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DataStructure{ /// /// 循环链表 /// /// 类型.. 阅读全文
摘要:
基本上,我们可以认为双向链表是单链表的一个改进。这个改进一个有益的地方就是,双链表不必像单链表一样,为了查找一个元素,沿着链表的特定一个方向,从头遍历到尾。通过双链表,我们可以沿着正反两个方向对链表内的元素进行查找。双链表的结点与单链表(循环链表)的稍稍有点不同,主要的不同就在与,双链表的节点多出了一个连接前一个节点的字段(详见灰色部分)。如下所示class DulNode{ private T data; /// /// 数据域 /// public T Data { get {return data;} set { data = value;} } private DulNode ne.. 阅读全文
摘要:
在单链表中,我们需要在内部有一个头节点,我们可以通过这个头节点找到其他的节点,相当于一个线索。 纵观顺序结构的线性表和单链表的实现,难点基本上都在于添加和删除操作。基于数组的线性表中,数组的索引就相当于是线性表的序号,但在单链表中,我们没有序号这个东西,所以在添加和删除操作中,我们需要先找到指定的元素,然后才能继续进行操作。在插入操作中,我们需要同时保存有当前节点的前一个节点和当前的节点,因为当... 阅读全文