自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(272)
  • 资源 (22)
  • 收藏
  • 关注

原创 使用PHP生成MySQL数据字典

一个项目完成之后,按照需求,我需要给这个项目写设计文档,数据库字典。项目开始的比较急,最开始建数据库的时候没有用excel写数据库字典。设计文档到时好说,但是数据库字典可真的是有点吓到我了。其实这只是一个简单的小函数,平时用到的几率也不大。这几十张表的数据库,一个一个的写,那真的是酸爽。但是,在需要的时候,他会给你省很多力气。有好的建议,请在下方输入你的评论。但是,这一切好像又都不是事。我们有强大的PHP啊。

2023-08-16 17:39:34 1068

原创 PHP使用phpmailer及SMTP服务实现邮件发送

使用git命令克隆到本地,或直接在该项目页面的右下方点击“ Download ZIP ”即可获取到完整的PHPMailer代码包,再到本地解压即可。博客偶尔会有留言和评论,我也会及时回复,但是有一个问题,我回复了,给我留言的人如果不再次进我的博客查看,他是不知道的,这个很不合理。这一步其实没有必要单拿出来说,但是,我们从github上下载下来的项目文件,不全是有用的,我们可以只将几个主文件上传到服务器中即可。我这里使用的是thinkphp5框架,我将其上传到了根目录下的extend目录中。

2023-08-16 17:38:21 820

原创 PHP报错:Deprecated Methods with the same name as their class will not be constructors in a future vers

PHP OOP使用和类名相同的方法名作为构造方法,是 PHP4 的写法,PHP 5中同时支持__construct和类同名方法,但__construct方法具有优先性。PHP 7开始使用和类名相同的方法名作为构造方法会报E_DEPRECATED级别的错误,提示在未来版本中会彻底抛弃类同名方法作为构造函数。百度了一下,官方给的说法是:PHP7以后的类的构造函数必须是__construct。所以找到对应的类,找到与类同名的函数,将函数名改为__construct即可。有好的建议,请在下方输入你的评论。

2023-08-16 17:36:56 403

原创 上传文件报413Request EntityToo Large错误解决办法

在apache环境中上传较大软件的时候,有时候会出现413错误,出现这个错误的原因,是因为apache的配置不当造成的,找到apache的配置文件目录也就是conf目录,和这个目录平行的一个目录叫conf.d打开这个conf.d,里面有一个php.conf。也可以选择在server{ }中设置:client_max_body_size 20m;误就发生在这个LimitRequestBody配置上,将这个的值改大到超过你的软件大小就可以了。设置到server{}内,控制该server的所有请求报文大小。

2023-08-16 17:35:45 2887

原创 面向对象程序设计中接口(interface)的使用

如果使用接口,我们定义两个接口,一个猫接口,里边一个抓老鼠方法。这样猫类和金鱼类就使用到了他们各自所需要的方法,而其他行为方法并没有授予给他们。可是类与类之间往往会有千丝万缕的关系,比如泛化、实现、组合、聚合、关联、依赖。下边我写了两个例子,一个是刚刚上边说到的两个动物的行为,另一个是关于银行取钱存钱及转账的例子。如果我们不使用接口,我们将把行为类中的所有方法都授予猫类和金鱼类,这显然是不合适的。行为类中定义了各种动物的行为,比如:抓老鼠,吐泡泡,挖洞,游泳等。我们现在有三个类:行为类、猫类、金鱼类。

2023-08-16 17:34:10 118

原创 windows以管理员的身份运行CMD

今天在工作的时候,使用CMD。运行失败,提示我需要使用管理员的身份运行CMD才可以。电脑在装系统的时候,我的用户不是最高权限的管理员。使用右键点击左下角的windows图标。有好的建议,请在下方输入你的评论。注意两图中画红框的位置。选择红框标注的那项。

2023-08-16 17:32:09 133

原创 C#如何打包EXE程序生成setup安装文件

右击”应用程序文件夹“,点击”添加“,选择”文件“,然后将"C:WindowsSystem32" 下面的”msiexec.exe“文件给添加进来,如果找不到,你可以直接搜。当然,你也可以再给msiexec.exe创建一个快捷方式命名为”unInstaller“。项目结束之后,有需要将winForm程序打包成.exe文件提供给用户。点击 工具->扩展和更新,选择联机,搜索installer,安装。同时在前头加上 ”/X “,注意:x后面有一个空格。有好的建议,请在下方输入你的评论。至此,卸载程序创建成功。

2023-08-16 17:30:23 1083

原创 C#工程建立后修改工程文件名与命名空间

小红框会出现在名字的右下角,点击之后,选将“原来的名字”重命名为“新的名字”,这样全部项目中已经存在的程序文件的命名空间都被改名了,自动完成。3、接下来要改项目属性中的默认命名空间名,这样新建程序文件后能保证命名空间名是正确的。如果有其他命名空间的错误,查看项目中的引用,将报错的引用删除,重新引用,在重新生成项目。使用之前的项目做二次开发,项目快结束的时候,需要把主项目的名称修改成我们想要的。如果想给文件夹改名,这一步很关键,如果不这样做,会报错文件夹命名失败。有好的建议,请在下方输入你的评论。

2023-08-16 17:29:20 1894

原创 C# int ? 关键字使用方法

使用C#的时间也不算短。但是今天看到了一个从来没有见过的写法Int?这是个什么写法,没见过啊,百度了查一下,也在这里记录一下。

2023-08-16 17:27:04 1170 1

原创 C#using关键字的使用方法

某些类型的非托管对象有数量限制或很耗费系统资源,在代码使用完它们后,尽可能快的释放它们时非常重要的。用using为命名空间或类型定义别名,当引入的多个命名空间包含相同名字的类型时,需要使用该类型时,可以通过using为其指定别名,使代码更加简洁,避免冲突。解决方法很简单,自定义的类继承IDisposable类,实现其Dispose方法。c:创建资源的Dispose方法的调用,并把它放进finally块。圆括号中的代码分配资源,Statement是使用资源的代码。有好的建议,请在下方输入你的评论。

2023-07-21 15:04:16 260

原创 C#is、as关键字及获取当前活动窗体的实例

判断当前活动子窗体类型是什么类型,使用as进行强制转换,最后弹出消息。主要代码就是以上这两部分,比较简单,但是如果不知道,还是比较麻烦的。这篇日志记录一下C#中is关键字及as关键字的用法。然后将当前子窗体置为活动窗体的时候触发。有好的建议,请在下方输入你的评论。将当前子窗体置为活动窗体时触发。在主窗体中建立一个方法:使用。获取当前窗体的活动子窗体。事件,其中调用主窗体的。

2023-07-21 15:02:52 294

原创 C# 未提供必须形参对应的实参

解决方法就是,在子类的构造函数后加上base关键字及对应父类构造函数需要的参数。接下来,我写了一个类来继承他,最开始,我是这样写的。这个问题是在写观察者模式中遇到的一个问题。大家注意,我这个构造函数中是有参数的。有好的建议,请在下方输入的评论。》中下载,下边只是部分代码。以上就是所有的解决方法。

2023-07-21 15:01:59 343

原创 C#winForm键盘事件

以上就是基本的键盘事件的一些需要注意的地方及实例,如果在调试过程中,打断点发现对应的按键不能进入方法中,那么就是对应的方法不支持这个按键。(2).KeyChar属性:用来获取按下的键对应的字符,通常是该键的ASCII玛(返回的是键盘的值,如按‘K‘返回就是K)。(6).KeyData属性:以Keys枚举值返回键盘键的键码,该属性包含修改键信息,用于判断按下键的所有信息(可返回组合键)(5).KeyCode属性:以Keys枚举值返回键盘键的键码,该属性不包含修改键信息,用于测试指定的键盘键。

2023-07-21 15:00:28 1963

原创 C#WinForm获取当前活动子窗体使用鼠标滚轮事件改变窗体大小

然后在其下添加方法Form1_MouseWheel(方法名字要与构造函数中添加的相同,具体是什么,看你心情)以上的代码基本上就实现了鼠标滚轮事件缩放子窗体的操作。获取当前活动子窗体使用鼠标滚轮事件改变窗体大小,有好的建议,请在下方输入你的评论。我们需要让子窗体显示在父窗体中。第三步添加鼠标滚轮事件。

2023-07-21 14:58:01 1415

原创 C#WinForm实现Loading等待界面

TransparencyKey:Control颜色为Control的部分透明。这个给用户的体验也不是很好,我这里想加一个Loading的进度条。BackColor:Control窗体背景颜色设为Control。FormBorderStyle:None不显示窗体边框和标题栏。项目启动的时候,加载进度条,界面UI加载完毕,进度条消失。ShowInTaskbar:False不在任务栏显示。上篇博客中解决了程序加载时屏幕闪烁的问题。有好的建议,请在下方输入你的评论。但是,加载的过程变得很缓慢。文末有资源,可下载。

2023-07-21 14:56:02 1201

原创 解决C#winForm窗口闪烁问题

这时窗体的Opacity or TransparencyKey 是不会起作用的,窗体的轮廓是可见的,在绘制区域会出现一个丑陋的黑色矩形框。启用双缓冲的首选方法是将该控件的 DoubleBuffered 属性设置为 true,这会产生同样的结果,原因不细说了。主要的原因有:使用了很多的组件导致加载缓慢,使用了性能差的组件(PictureBox、Button等)。如果要求不高,前两种也是可以的。WinForm程序窗体组件太多,第一次打开的时候加载会出现闪屏的问题。有好的建议,请在下方输入你的评论。

2023-07-21 14:54:32 1797 1

原创 C#读取写入文件的三种方式

最新对文件的操作比较频繁。这里记录一下常用的几种文件读写的方式。我这里使用窗体来做测试,例子在文末,可下载。如果有更好的方法,欢迎在下边留言补充。

2023-07-21 14:53:09 946

原创 C# GDI+编程之Graphics类

在绘图之前,必须在指定的窗体上创建一个Graphics对象,才能调用Graphics类的方法画图。调用窗体或控件的CreateGraphics方法可以获取对Graphics对象的引用,该对象表示控件或窗体的绘图画面。GDI+是GDI的后继者,它是.NET Framework为操作图形提供的应用程序编程接口,主要用在窗体上绘制各种图形图像,可以用于绘制各种数据图像、数学仿真等。最近需要使用到C#DrawLine绘制直线这个功能,对这个了解的不多,记录一下使用的时候遇到的问题。绘制线的基础部分,这个之前在。

2023-07-21 14:52:00 496

原创 C# 右键菜单 contextMenuStrip

首先在工具箱中找到contextMenuStrip控件。这样你相应的控件上就可以使用右键属性的菜单了。具体对应需要什么功能,看你的需要。最近需要使用到C#的右键菜单contextMenuStrip控件。默认名称为:contextMenuStrip1.有好的建议,请在下方输入你的评论。

2023-07-21 14:49:51 409

原创 C#委托相关知识

这篇笔记是对之前看过的委托的一个补充,也是对最近工作中遇到的委托的一个总结吧。Func 表示传入参数为object, string 返回值为int的委托。Action 表示有传入参数int,string,bool无返回值的委托。Func 表示传入参数为T1,T2,,T3(泛型)返回值为int的委托。Action 表示有传入4个int型参数,无返回值的委托。

2023-07-19 11:45:14 193

原创 C#被指定窗体的MdiParent的窗体不是MdiContainer

这个问题的原因是父窗体的IsMdiContainer 属性设置为false导致的。有两种方式设置窗体的IsMdiContainer 属性。第一种,在父窗口的构造函数中添加this.IsMdiContainer = true;即可指定窗口的IsMdiContainer属性为true。第二种,在visualstudio的属性窗口中找到IsMdiContainer,设置为true,即可。被指定窗体的MdiParent的窗体不是MdiContainer。有好的建议,请在下方输入你的评论。

2023-07-19 11:20:34 318

原创 C#窗体添加自定义控件

将自定义控件的动态链接库(.dll)放到项目中:文件夹名字随意。在工具箱中选中刚刚添加的工具项,点击右键,选择添加项。点击浏览,选择刚刚你添加到项目中的dll。弹出以下窗体:选择你要添加的dll。有好的建议,请在下方输入你的评论。这样自定义控件就添加成功了。C#窗体添加自定义控件。

2023-07-18 14:53:02 1574

原创 C#中的抽象类(abstract)

有好的建议,请在下方输入你的评论。

2023-07-18 14:52:15 951

原创 C#List转IList方法

它仅仅是所有泛型类型的接口,并没有太多方法可以方便实用,如果仅仅是作为集合数据的承载体,确实,IList可以胜任。接口和类的区别是本质的,类是负责功能的实现,而接口则是负责功能的定义。只是想创建一个基于接口IList的对象的实例,只是这个接口是由List实现的。1、当你只想使用接口的方法时,ILis这种方式比较好.他不获取实现这个接口的类的其他方法和字段,有效的节省空间.。是想创建一个List,而且需要使用到List的功能,进行相关操作。

2023-07-18 14:51:29 1845

原创 C#安装.Net平台科学计算库Math.Net Numerics

Visual studio 2015安装这个库的时候,先更新Nuget,Nuget是C#的程序包管理器,许多扩展安装包,只需要通过相应的命令即可下载使用。Math.Net库涵盖的主题包括特殊函数,线性代数,概率模型,随机数,插值,积分,回归,优化问题等。工作的时候需要使用到C#的Math.Net库来进行计算。这里记录一下,安装Math.Net库的过程。我这里设置的是自动更新,所以第一步可以省略。安装matlab相关组件。有好的建议,请在下方输入你的评论。在按回车,等待安装完成即可。

2023-07-18 14:50:12 3560

原创 C#鼠标拖拽,移动图片实例

白色框的pictureBox,我添加的image属性的图片是一张中心透明四周是白边回来Png图片,这个需要注意一下。下边的绿色是一个pictureBox,白色框也是一个pictureBox,他们二者是子父级关系。1:子级pictureBox如何在父级PictureBox上透明显示。2:背景透明设置完成,但是现在还是不能够拖拽四周或四个角改变大小。到这里,小的pictureBox就已经背景透明并且可拖拽的显示在其父级上边了。有好的建议,请在下方输入你的评论。绿色是父级,白色框是子级。这个就是完成的功能。

2023-07-18 14:49:18 2419

原创 C#(六十二)之泛型的约束

为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。类型参数必须是指定的接口或实现指定的接口。约束接口也可以是泛型的。类型参数必须是值类型。类型参数必须是引用类型,包括任何类、接口、委托或数组类型。2:确保只能使用支持指定基类或派生类的类型实例。将约束定义在父类中,由其派生出的子类将受其约束。1:它允许在泛型类中使用有约束指定的基类成员。类型参数必须是指定的基类或派生自指定的基类。

2023-07-18 14:48:04 631

原创 C#(六十)之Convert类 和 Parse方法的区别

Double.TryParse 与 Double.Parse 又较为类似,但它不会产生异常,转换成功返回 true,转换失败返回 false。即 3.5转换为4,4.5 转换为 4,而 5.5 转换为 6。不过4.6可以转换为5,4.4转换为4。Convert.ToInt32(null)会返回0而不会产生任何异常,但int.Parse(null)则会产生异常。Convert.ToInt32是转换继承自Object的对象为int的(可以有很多其它类型的数据).int.Parse是转换String为int。

2023-07-18 14:46:34 1130

原创 C#窗体设计器消失,打开.CS文件只有代码

Form1窗体变成了.CS类文件。打开只有代码,右键没有 “查看设计器” 的选项。我在Form1.CS文件中 定义了一个委托,两个类Form1和lockGate。我将lockGate类放到了Form1上边。解决方法:将lockGate类放到Form1类下边就好了。百度了一下,大多数的结论都是重启编辑器。有好的建议,请在下方输入你的评论。今天在工作的时候遇到一个问题。

2023-07-11 09:19:38 1625

原创 C#内存不够解决方法

百度了一下,C#在生成的过程中如果是生成对应的32位系统,分配的内存相对会少一点,可能不够程序的使用。打开项目设置,将生成的目标平台改为X64,再次运行程序。注意下图中我用红框标出的位置,实际是一个三维数组。但是出现这个问题和三维数组没有关系。有好的建议,请在下方输入你的评论。

2023-07-11 09:18:31 1767

原创 C#编码规范

例如:正确不正确。

2023-07-11 09:16:39 1363

原创 C#(五十九)之三种数据结构 stack queue sortedList

如果您使用索引访问各项,则它是一个动态数组(ArrayList),如果您使用键访问各项,则它是一个哈希表(存储键值)也就是说是两个数组,相互关联。初始化 Queue 类的新实例,该实例包含从指定集合复制的元素,具有与所复制的元素数相同的初始容量并使用默认增长因子。初始化 Queue 类的新实例,该实例为空,具有指定的初始容量并使用指定的增长因子。初始化 Queue 类的新实例,该实例为空,具有指定的初始容量并使用默认增长因子。返回 SortedList 中的指定键的索引,索引从零开始。

2023-07-10 16:17:24 283

原创 C#(五十八)之C#List

您可以设置这个值以减少容量,也可以调用trin()方法来减少容量以适合实际的元素数目。前几天,看同事写的代码中有list相关的字眼,百度了一下,原来是C#中list泛型集合。重载的公有方法,用于在排序的List内使用二分查找来定位指定元素.重载的公有方法,,查找并返回最后一个匹配元素的索引。重载的公有方法,返回一个用于迭代List的枚举器。重载的公有方法,查找并返回每一个匹配元素的索引。查找并返回List内的出现的第一个匹配元素。把List内的元素拷贝到一个新的数组内。拷贝指定范围的元素到新的List内。

2023-07-10 09:55:22 818

原创 C#(五十七)之C#集合Collections

这样,在我们使用ArrayList中的数据来处理问题的时候,很可能会报类型不匹配的错误,也就是说ArrayList不是类型安全的。既使我们保证在插入数据的时候都很小心,都有插入了同一类型的数据,但在使用的时候,我们也需要将它们转化为对应的原类型来处理。同时,数组也有很多缺点。如果,要增添一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。从数组的第一个元素开始复制某个范围的元素到另一个数组的第一个元素位置。从当前的一维数组中复制所有的元素到一个指定的一维数组的指定索引位置。

2023-07-10 09:53:28 245

原创 C#(五十六)之线程池

QueueUserWorkItem启动线程池里得一个线程(队列的方式,如线程池暂时没空闲线程,则进入队列排队)GetMaxThreads最多可用线程数,所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。线程池是一种多线程的形式,其中的任务被添加到队列中,并在创建线程时自动启动。SetMinThreads设置线程池最少需要保留的线程数,不足空线程补齐。GetMinThreads检索线程池在新请求预测中维护的空闲线程数。SetMaxThreads设置线程池中的最大线程数,多余在池外排队。

2023-07-10 09:50:13 475

原创 C#(五十五)之线程死锁

仔细观察第一部分代码,会发现,男孩和女孩两次锁定的对象顺序不同,女孩第一次锁定是刀,第二次是叉子。死锁是指多个线程共享资源是,都占用同意部分资源,而且都在等待对方师范另一部分资源,从而导致程序停滞不前的情况。在两次锁定之间让其暂停一会,如下 增加 thread.Sleep(100);将锁定的对象顺序改为一致之后,死锁消失。多线程避免死锁关键,锁定对象顺序要相同。这样输出是正常的,如何让其变成死锁呢?有好的建议,请在下方输入你的评论。为什么会出现这样的结果呢?

2023-07-10 09:47:48 192

原创 C#(五十四)之线程Mutex互斥

在声明mutex对象时,在构造函数中传入该线程的名字,两个应用线程的名字相同,我们就认为该mutex线程时系统互斥线程。利用所需的安全访问权限,打开指定的已命名的互斥体(如果已经存在),并返回指示操作是否成功的值。使用可指示调用线程是否应具有互斥体的初始所有权以及字符串是否为互斥体的名称。使用可指示调用线程是否应具有互斥体的初始所有权以及字符串是否为互斥体的名称。打开指定的已命名的互斥体(如果已经存在),并返回指示操作是否成功的值。用一个指示调用线程是否应拥有互斥体的初始所属权的布尔值。

2023-07-06 13:48:12 595

原创 C#(五十五)之线程死锁

仔细观察第一部分代码,会发现,男孩和女孩两次锁定的对象顺序不同,女孩第一次锁定是刀,第二次是叉子。死锁是指多个线程共享资源是,都占用同意部分资源,而且都在等待对方师范另一部分资源,从而导致程序停滞不前的情况。在两次锁定之间让其暂停一会,如下 增加 thread.Sleep(100);将锁定的对象顺序改为一致之后,死锁消失。多线程避免死锁关键,锁定对象顺序要相同。这样输出是正常的,如何让其变成死锁呢?有好的建议,请在下方输入你的评论。为什么会出现这样的结果呢?

2023-07-06 13:47:17 772

原创 C#(五十三)之线程同步、互锁

Interlocked.CompareExchange(ref value1, value2, value3) 实现比较和交换两种功能:值1和值3比较,如果相同,把值2给值1,不相同则不作任何操作;TryEnter(Object, Boolean) 尝试获取指定对象上的排他锁,并自动设置一个值,指示是否得到了该锁。Wait(Object) 释放对象上的锁并阻止当前线程,直到它重新获取该锁。Enter(Object) 在指定对象上获取排他锁。Exit(Object) 释放指定对象上的排他锁。

2023-07-06 13:44:03 437

原创 C#(五十二)之线程

被定义为程序的执行路径。如果您的应用程序涉及到复杂的和耗时的操作,那么设置不同的线程执行路径往往是有益的,每个线程执行特定的工作。不能采用先执行 MemoryBarrier 调用之后的内存存取,再执行 MemoryBarrier 调用之前的内存存取的方式。在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。这个属性代表了线程运行时状态,在不同的情况下有不同的值,我们有时候可以通过对该值的判断来设计程序流程。在当前正在运行的线程上为此线程的当前域在指定槽中设置数据。

2023-07-05 09:04:16 230

小程序(三)配置tabbar及自定义tabbar样式

关于tabbar部分,官方文档是有明确的说明的,当然,我这里是不存在把官方文档给你复制一遍的情况。我大概把我再看官方文档过程中遇到的坑,大概复述一下。 一:配置tabbar 这个主要是使用小程序自带的tabbar,在项目根目录下的app.json中配置,这个简单配置一下就可以了。

2020-09-26

blur-admin-master.zip

这个模板比较有现代感; 而且一次就给2套; 不过是为 Angular 量身定做的; 下面的 demo 链接需要才可正常浏览; demo1:http://akveo.com/blur-admin-mint/#/dashboard

2020-09-26

gentelella-master.zip

gentelella 则是一款黑色主题的模板; 这个模板我现在也在用; demo:https://colorlib.com/polygon/gentelella/index.html

2020-09-26

startbootstrap-sb-admin-2-master

大名鼎鼎的 sb 模板,这个我就不做太多的介绍了,用上就知道了。 demo:https://blackrockdigital.github.io/startbootstrap-sb-admin/

2020-09-26

startbootstrap-sb-admin-master.zip

大名鼎鼎的 sb 模板,这个我就不做太多的介绍了,用上就知道了。 demo:https://blackrockdigital.github.io/startbootstrap-sb-admin/

2020-09-26

ace后台模板ace-master

这套后台管理系统的模板,是我刚刚开始做开发的时候使用的。做的还是挺好的,就是样式可能有点老。demo:http://ace.jeka.by/

2020-09-26

设计模式(十六)之抽象工厂模式.zip

抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

2020-02-17

设计模式(十五)之观察者模式.zip

观察者模式主要应用于一对多的依赖关系,让多个观察者对象同时监听某一个主体对象,这个主题对象在状态发生变化时,会通知所有观察者。当一个对象改变需要同时改变其他对象,而且他不知道具体有多少对象需要改变的时候,应该考虑使用观察者模式。

2020-02-17

设计模式(十四)之建造者模式.zip

建造者模式精髓:建造者模式使得建造代码与表示代码的分离,可以使客户端不必知道产品内部组成的细节,从而降低了客户端与具体产品之间的耦合度。

2020-02-17

设计模式(十三)之外观模式.zip

外观模式(Facade)的定义:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这个子系统更加容易使用。

2020-02-17

设计模式(十二)迪米特原则(最少知识原则).zip

迪米特(最少知识)法则:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

2020-02-17

设计模式(十一)之模板方法模式.zip

模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。

2020-02-17

设计模式(十)之原型模式.zip

原型模式:就是从一个对象再创建另一个可定制的对象,而且不需要知道任何创建的细节。 重写抽象类中的Clone方法或者重写ICloneable中的Clone方法。 也就是说:要实现克隆的这个类,必须实现其Clone方法。

2020-02-17

设计模式(九)之工厂模式.zip

工厂模式:定义一个用于创建对象的接口,让子类来决定实例化哪一个类,工厂方法使一个类的实例化延迟到子类。

2020-02-17

设计模式(八)之静态代理模式.zip

静态代理总结: 优点:可以做到在符合开闭原则的情况下对目标对象进行功能扩展。 缺点:我们得为每一个服务都得创建代理类,工作量太大,不易管理。同时接口一旦发生改变,代理类也得相应修改。

2020-02-17

设计模式(七)之装饰模式.zip

装饰模式精髓主要在装饰类Decorate.cs及子类中的base(执行父类方法)关键字,这二者体现了设计模式的精髓。

2020-02-17

设计模式(六)之里氏替换原则.zip

里氏替换原则有如下特点: 代码共享,减少创建类的工作量 提高代码的重用性 提高代码的可扩展性 提高产品代码的开放性 继承侵入性 只要继承,必须拥有父类的内容 降低代码的灵活性,子类必须拥有父类的属性和方法 增强耦合性。

2020-02-17

设计模式(五)之依赖倒转原则.zip

依赖倒置原则的包含如下的三层含义: 1. 高层模块不应该依赖低层模块,两者都应该依赖其抽象 2. 抽象不应该依赖细节 3. 细节应该依赖抽象 就是面向接口编程,采用依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。

2020-02-17

设计模式(四)之开放封闭原则.zip

软件实体(类、模块、函数等等)应该可以扩展,但是不可以修改。 也就是如果需求发生变化导致程序中多个依赖模块都发生了级联的改动,就说明这个程序是有问题的,程序变得相对脆弱、无法重用。开放封闭原则就相对的解决了这个问题,它强调的是你设计的模块应该从不改变(绝对不改变是不可能的,只能相对少改动)。当需求变化时,你可以通过添加新的代码来扩展这个模块的行为,而不去更改那些已经存在的可以工作的代码。

2020-02-17

设计模式(三)之单一职责原则.zip

软件设计真正要做的内容,就是发现职责并把那些职责互相分离。单一职责原则可以使类的复杂度降低,实现什么职责都有清晰明确的定义;类的可读性提高,复杂度降低;可读性提高了,代码就更容易维护;变更(需求是肯定会变)引起的风险(包括测试的难度,以及需要测试的范围)降低。

2020-02-17

设计模式(二)之策略模式.zip

策略模式:定义了算法家族,分别封装起来,让其之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

2020-02-17

设计模式(一)之简单工厂模式

简单工厂模式,通俗点说,就是有一个基类(class abstract interface)以上三种类型都可以,在基类中定义方法,由子类来实现重写或者实现,那我们声明变量类型的时候,直接声明成这个基类的类型就好了。

2020-02-17

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除