设计模式
文章平均质量分 83
设计模式
自己的九又四分之三站台
好好学习,天天向上
展开
-
MVVM编程框架
MVVM是Model-View-ViewModel的简写。它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。当然这些事 ViewModel 已经帮我们做了,它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑。微软的WPF带来了新的技术体验,软件UI层更加细节化、可定制化。同时,在技术层面,WPF也带来了 诸如Binding、Dependency Property、Routed Events、Comma原创 2021-11-09 15:28:14 · 427 阅读 · 0 评论 -
希尔排序
1. 希尔排序:ShellSort1.1 希尔排序的原理:希尔排序是将待排序的数组元素 按下标的一定增量分组 ,分成多个子序列,然后对各个子序列进行直接插入排序算法排序;然后依次缩减增量再进行排序,直到增量为1时,进行最后一次直接插入排序,排序结束。1.2 代码using SortInterface;using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace So原创 2020-09-23 22:16:51 · 1302 阅读 · 0 评论 -
归并排序
1.归并排序:MergeSort1.1归并排序原理第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置重复步骤3直到某一指针超出序列尾将另一序列剩下的所有元素直接复制到合并序列尾1.2 代码using SortInterface;using System;using System.Collections.Generic原创 2020-09-16 12:01:45 · 1301 阅读 · 0 评论 -
基数排序
基数排序:RadixSort LSD1.1 基数排序的原理:属于“分配式排序”(distributionsort),基数排序法又称“桶子法”(bucketsort)或binsort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O(nlog®m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的比较性排序法,同时基数排序分最高位优先"(MSD)法和最低位优先"(LSD)法。以下讲解的是LS原创 2020-09-12 11:16:08 · 1333 阅读 · 0 评论 -
快速排序
1. 快速排序:QuickSort1.1 快速排序的原理:快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。该方法的基本思想是:1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间原创 2020-09-12 10:59:07 · 1286 阅读 · 0 评论 -
选择排序
1. 选择排序:SelectSort1.1 选择排序的原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。重复第二步,直到所有元素均排序完毕。1.2 代码using SortInterface;using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace SortItem{原创 2020-09-03 23:05:53 · 1247 阅读 · 0 评论 -
插入排序
1. 插入排序:InsertSort1.1 插入排序的原理:插入排序的工作方式像许多人排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。拿在左手上的牌总是排序好的,原来这些牌是桌子上牌堆中顶部的牌1.2 代码using SortInterface;using System;using System.Collections.Generic;using Sys原创 2020-09-03 22:53:23 · 1578 阅读 · 0 评论 -
双向冒泡排序
1. 双向冒泡排序:DoubleBubbleSort1.1 双向冒泡排序的原理:先对数组从左到右进行冒泡排序(升序),则最大的元素去到最右端再对数组从右到左进行冒泡排序(降序),则最小的元素去到最左端以此类推,依次改变冒泡的方向,并不断缩小未排序元素的范围,直到最后一个元素结束1.2 代码using SortInterface;using System;using System.Collections.Generic;using System.Linq;using System.Te原创 2020-09-01 11:43:34 · 4308 阅读 · 0 评论 -
冒泡排序
1.冒泡排序:BubbleSort1.1 冒泡排序的原理:1.对于一个数组,冒泡排序算法会比较相邻的两项的大小,并进行换。2.对每一对相邻的元素做同样的调整,如:第一个和第二个,第二和第三个,第三个和第四个等等,以此类推。这样下来,最后的素会是最大的。3.重复以上步骤。如果有n个元素,则第一次循环进行n-1次,第二循环进行n-2次,…………,第n-j次循环过后,会按大小顺序排出j较大的数。4.持续以上的步骤,直到没有任何一堆数字需要比较。1.2 代码using SortInterface;原创 2020-09-01 11:41:51 · 1320 阅读 · 0 评论 -
1/n 排序算法,排序算法演示界面与框架搭建
排序算法其实一直在纠结到底下一个类型算法写什么,一直没有确定下来数据结构.Net中的框架微服务架构.Net Core大数据ArcGIS二次开发一直在上面纠结,今天公司有一个同事突然和我聊起来了算法,说想学算法,一开始问看算法导论如何,我和他说可以买着,但是要有心里准备,因为你注定要先看一些基础的算法,你要学习数据结构,想到这里那就想写了,而且想起大学的时候参加蓝桥杯一群人在哪里讨论排序算法时候的热情,想想可能写代码对于我来说真的是一件兴趣,我想就算将来不做开发了,平常谢谢代码也会想老头们原创 2020-08-31 09:59:05 · 1584 阅读 · 0 评论 -
23/23 责任链模式
责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。案例现在需要将字符串处理后存储到数据库中:如下<xiaocai> :)<替换为( >替换为)xiaocai替换为 小菜:)替换为 V1.1版本如下为代码简单实现: private void btnSimple_Click(object sender, EventArgs e)原创 2020-07-13 23:34:20 · 1385 阅读 · 0 评论 -
22/23 观察者模式和发布订阅模式
1.观察者模式(Observer Pattern)一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。1.1案例现在有对象:孩子、猫、狗、手机、母亲现在手机响了->猫叫了一声-> 狗叫了一声->孩子哭了->母亲关闭手机1.1.1版本代码如下:public class Baby{ public void Cry() { Console.WriteLine("宝贝哭了..."); }}public c原创 2020-07-12 22:06:43 · 1408 阅读 · 0 评论 -
21/23 备忘录模式
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。案例说明现在玩一个游戏,亿万僵尸[技术安利游戏…很好玩,很考验重构能力…]保存游戏状态读取游戏状态亿万僵尸包含如下资源;帐篷士兵游侠箭塔代码public class Game{ public int Tent { get; set; } public int Soldiers {原创 2020-07-12 00:29:00 · 1332 阅读 · 0 评论 -
20/23 解释器模式
解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。1.案例现在有一个描述字符构建模块,其具体描述如下:现在有一个对象几何,现在需要重新按照一个描述输出1.1版本代码如下:public class Student{ public string StudentName { get; se原创 2020-07-11 23:39:37 · 1373 阅读 · 0 评论 -
19/23 命令模式
命令模式(Command Pattern)将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。1.案例现在有操作输出,但我们点击输出CURD,分别对应创建(Create)、更新(Update)、读取(Retrieve)和删除(Delete)1.1版本代码如下:/// <summary>/// 应用程序的主入口点。/// </summary>static void Ma原创 2020-07-09 00:20:38 · 1409 阅读 · 0 评论 -
18/23 访问者模式
访问者模式(Visitor Pattern)将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进行分离,是行为类模式中最复杂的一种模式。ps:很少用,但是如果用了就说明一定要用它(除了乱用)1.案例说明需求描述小组有恒定的成员xiaocai、xiaozhang、xiaoxu[暂定为三个不同的对象]现在每个人在上班期间都要进行代码工作的编写1.1 初始代码原创 2020-07-01 23:41:47 · 1339 阅读 · 0 评论 -
17/23 迭代器模式
迭代器模式(Iterator)提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。如果说在JAVA和C#代码编写过程中使用最多的设计模式不是工厂,它一定是迭代器模式。在C#中集合、数组有以下类型 Array、List、HashTable、Stack、Queue、Set、BitArray等等…而在C#中对于集合或数组的访问方式是foreach(var item in List){}foreach(var item in Stack){ }## C#原创 2020-06-30 23:06:28 · 1275 阅读 · 0 评论 -
16/23 状态模式
状态模式(State Pattern)类的行为是基于它的状态改变的,在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。1.简单案例:红绿灯现在我们有一个红绿灯变化,红、黄、绿,不同灯时不同的提示,当然颜色就是提示,每一个灯之后切换一下,最后形成闭环,比如:红->黄->绿->红1.1基于上述我们简单实现如下:public class LightFactory{ public static LightColor CurrentL原创 2020-06-29 23:47:43 · 1869 阅读 · 0 评论 -
15/23 策略模式
策略模式(Strategy Pattern)个类的行为或其算法可以在运行时更改,在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。案例我们还是将之前的算子案例拿出来public interface IOperator{ void Operator();}public class Operator01 : IOperator{ public void Operator() {原创 2020-06-29 22:26:03 · 1308 阅读 · 0 评论 -
14/23 装饰器模式
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。使用场景:扩展一个类的功能。动态增加功能,动态撤销。[AOP设计常见设计、后续博客会讲述…]1 使用场景一:扩展类功能1.1 生产上线代码现在我们写了一个很强大同时又非常复杂的功能。如下为该算法[由于只是模拟故,所以乱写一通]public interface IOperator{ void Operator();原创 2020-06-29 21:39:21 · 1321 阅读 · 0 评论 -
13/23 代理模式
代理模式 Proxy Pattern。一个类代表另一个类的功能代码案例买手机 public abstract class IPhone { public abstract string PhoneName { get; } } public class HuaweiPhone : IPhone { public override string PhoneName原创 2020-06-27 22:06:48 · 1342 阅读 · 0 评论 -
12/23 适配器模式
适配器模式 Adapter Pattern是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。1.生活中比喻充电插头有港版、国版,那么如何让港版的在大陆进行充电。那么我们就加一个电源充电转换插头2.代码中的比喻有一些操作一样,但是使用的底层技术不一样,如以前博客中讲的Doc文档的操作,分为NPOI、Docx、Aspose.Words、甚至于Office,他们都是对于一个Word文档的原创 2020-06-26 20:42:39 · 1388 阅读 · 0 评论 -
11/23 享元模式Flyweight Pattern
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。运用共享技术有效地支持大量细粒度的对象,主要解决存在大量对象时,有可能会造成的内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。应用场景系统中有大量对象这些对象消耗大量内存。这些对象的状态大部分可以外部化。这些对象可以按照内蕴状态分为很多组,当把外蕴对象原创 2020-06-23 22:27:22 · 1340 阅读 · 0 评论 -
10/23 组合模式 Composite
组合模式 Composite将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 “组合对象” 的含义。组合模式可以让客户端像修改配置文件一样简单的完成本来需要流程控制语句来完成的功能。组合模式是树状结构专用模式。经典案例:系统目录结构,网站导航结构类图如下:代码如下:/// <summary>/// INode/// </summary>p原创 2020-06-17 22:43:59 · 1300 阅读 · 0 评论 -
9/23 结构型设计模式:门面模式和调停者模式
门面模式和调停者模式门面模式 Facade门面模式,是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。通俗解读当需要提供给其他人功能时,实际代码需要做很多调动,而这样的工作又有很多类。而这每一类之间又存在细节的不同,如果实质编码结构如下:案例说明对于业务或者算法进行实现后,软件模块清晰,代码结构如下图所示但是,在正常业务上现在存在调用的方式,如:扩展业务一:现在需要执行完模块一后执行模块三扩展业务二:执行完模块五原创 2020-06-14 22:15:14 · 1637 阅读 · 0 评论 -
7/23 结构型设计模式:桥接模式
桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式。emmm… 上述描述是将百度百科的描述粘贴过来的,反正我觉得很绕的。我理解桥接模式是:现在给我们提供了别人实现或者分装好的模块,而我们由于项目的问题或者技术能力深度问题导致我们没有办法进行修改,故采用再封装一层的解决方法。而这个的解决如下:将ADO.Net中对于各类关系型数据库的访问封装为IDBHelper,提取共性(如果有不妨再提原创 2020-06-08 23:09:57 · 1378 阅读 · 0 评论 -
6/23 创建型设计模式:建造者模式
建造者模式又叫创建者模式,是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。建造者模式和抽象工厂模式存在异曲同工的地方,但是抽象工厂模式是构建出工厂中的所有对象,而建造者模式是通过多个属性拼接形成一个对象。适用场景需要生产的产品对象有复杂的内部结构。需要生产的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。在对象创建过程中会使用到系统中原创 2020-06-04 22:47:36 · 1387 阅读 · 0 评论 -
5/23 创建型设计模式: 原型模式
原型模式原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。JAVA与CSharpJAVA与C#原本就支持原型模式,因为每一个Class都集成Obje原创 2020-06-03 22:43:09 · 1423 阅读 · 2 评论 -
4/23 创建型设计模式:抽象工厂
1.回答上一篇博客中最后的问题。代码和V1版本代码没有区别,将对于手机的细节转变为工厂方法,那么他有什么优势呢?1.其一:最大的优势就是解耦和组合!使用工厂方法将对象的创建统一入口到工厂方法中,所有的扩展和修改修改工厂方法,对于界面调用端,它只需要认识到工厂层,而不需要认识到实现细节。2.第二当对象和接口需要复杂的new或者多个对象组合之后才能组成所需要的对象,工厂方法便可以发挥作用2.基于上一篇博客的例子抽象工厂是在什么业务场景下进行升级重构的?现在在手机的细节上除操作系统外,还有国家、电原创 2020-06-01 22:43:55 · 1229 阅读 · 1 评论 -
3/23 创建型设计模式:简单工厂与抽象工厂
简单工厂、工厂方法的使用,是一个问题逐步演变的过程由简单工厂->工厂方法。故在此合并梳理知识点。代码都是为了解决实际问题,在此我们现在假设一种业务场景,我们场景就不来鸡鸣狗叫了首先:我们现在用手机来做业务场景,现在又手机如下:苹果、三星、华为、塞班。现在每一种手机存在一个接口需要显示手机的操作系统。基于此我们可以逐步演变如下代码:1.V1业务实现/// <summary>/// 苹果手机/// </summary>public class ApplePhone原创 2020-05-30 00:15:01 · 1244 阅读 · 0 评论 -
1/23 创建型设计模式:单例模式
介绍单例模式是23种设计模式最为简单的一种,属于创建型设计模式中的一种。其中最主要就是保证一下代码特性:保证一个类仅有一个实例,并提供一个访问它的全局访问点。设计模式是编码思想的一种应用,如果博客中涉及到对于涉及模式的将会采用C#、Java两种语言均实现一次,实质上没有太大的区别。如果有可能会另外采用Python并结合语言特性单独写一篇Python中对于设计模式的实现。由于本人主修C#,故会由C#推演JAVA任何代码实现当前业务后便是一个胜利,但是如何设计一个富有弹性、软件调用方便的代码结原创 2020-05-27 23:08:57 · 1338 阅读 · 0 评论