├── .gitattributes ├── .gitignore ├── CSharpAlgorithm.sln ├── CSharpAlgorithm ├── App.config ├── CSharpAlgorithm.csproj ├── Combine │ └── PermutationAndCombination.cs ├── DbList │ ├── DbLinkList.cs │ └── DbNode.cs ├── Dijkstra │ └── Dijkstra.cs ├── Graph │ └── GraphTraverse.cs ├── Huffman │ ├── HuffNode.cs │ └── HuffmanTree.cs ├── List │ ├── IListDS.cs │ ├── LinkList.cs │ └── SeqList.cs ├── Program.cs ├── Properties │ └── AssemblyInfo.cs ├── Queue │ ├── CSeqQueue.cs │ ├── IQueue.cs │ └── LinkQueue.cs ├── Search │ └── SearchExtention.cs ├── Sort │ ├── QuickSort.cs │ ├── Sort.cs │ └── SortExtention.cs ├── Stack │ ├── IStack.cs │ ├── LinkStack.cs │ └── SeqStack.cs └── Tree │ ├── BiTree.cs │ ├── LinkNode.cs │ └── Node.cs ├── HE23DesignPatterns ├── DesignMethod.csproj ├── OpenDesign.cs ├── Properties │ └── AssemblyInfo.cs ├── StartDesign.cs ├── 中介者模式 │ ├── Client.cs │ └── Program.cs ├── 享元模式 │ ├── Client.cs │ └── Program.cs ├── 代理模式 │ ├── Client.cs │ └── Program.cs ├── 单例模式 │ ├── Program.cs │ └── Singleton.cs ├── 原型模式 │ ├── Client.cs │ └── Program.cs ├── 命令模式 │ ├── Client.cs │ └── Program.cs ├── 备忘录模式 │ ├── Client.cs │ └── Program.cs ├── 外观模式 │ ├── Client.cs │ └── Program.cs ├── 工厂方法 │ ├── Food.cs │ └── Program.cs ├── 建造者 │ ├── Customer.cs │ └── Program.cs ├── 抽象工厂 │ ├── Client.cs │ └── Program.cs ├── 桥接模式 │ ├── Cilent.cs │ └── Program.cs ├── 模板模式 │ ├── Client.cs │ └── Program.cs ├── 状态模式 │ ├── Client.cs │ └── Program.cs ├── 策略者模式 │ ├── Client.cs │ └── Program.cs ├── 简单工厂 │ ├── Client.cs │ └── Program.cs ├── 组合模式 │ ├── Client.cs │ ├── Client2.cs │ └── Program.cs ├── 装饰者模式 │ ├── Client.cs │ └── Program.cs ├── 观察者模式 │ ├── Client.cs │ └── Program.cs ├── 解释者模式 │ ├── Client.cs │ └── Program.cs ├── 设计摘要 │ ├── 创建性模式.html │ ├── 结构型模式.html │ ├── 行为型模式.html │ └── 设计原则.html ├── 访问者模式 │ ├── Client.cs │ └── Program.cs ├── 责任链模式 │ ├── Client.cs │ └── Program.cs ├── 迭代器模式 │ ├── Client.cs │ └── Program.cs └── 适配器 │ ├── CilentClass.cs │ ├── CilentObject.cs │ └── Program.cs ├── README.md ├── 基于C#的23种设计模式.pdf └── 数据结构与算法:C#语言描述(中文).pdf /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | [Xx]64/ 19 | [Xx]86/ 20 | [Bb]uild/ 21 | bld/ 22 | [Bb]in/ 23 | [Oo]bj/ 24 | 25 | # Visual Studio 2015 cache/options directory 26 | .vs/ 27 | # Uncomment if you have tasks that create the project's static files in wwwroot 28 | #wwwroot/ 29 | 30 | # MSTest test Results 31 | [Tt]est[Rr]esult*/ 32 | [Bb]uild[Ll]og.* 33 | 34 | # NUNIT 35 | *.VisualState.xml 36 | TestResult.xml 37 | 38 | # Build Results of an ATL Project 39 | [Dd]ebugPS/ 40 | [Rr]eleasePS/ 41 | dlldata.c 42 | 43 | # DNX 44 | project.lock.json 45 | artifacts/ 46 | 47 | *_i.c 48 | *_p.c 49 | *_i.h 50 | *.ilk 51 | *.meta 52 | *.obj 53 | *.pch 54 | *.pdb 55 | *.pgc 56 | *.pgd 57 | *.rsp 58 | *.sbr 59 | *.tlb 60 | *.tli 61 | *.tlh 62 | *.tmp 63 | *.tmp_proj 64 | *.log 65 | *.vspscc 66 | *.vssscc 67 | .builds 68 | *.pidb 69 | *.svclog 70 | *.scc 71 | 72 | # Chutzpah Test files 73 | _Chutzpah* 74 | 75 | # Visual C++ cache files 76 | ipch/ 77 | *.aps 78 | *.ncb 79 | *.opendb 80 | *.opensdf 81 | *.sdf 82 | *.cachefile 83 | *.VC.db 84 | 85 | # Visual Studio profiler 86 | *.psess 87 | *.vsp 88 | *.vspx 89 | *.sap 90 | 91 | # TFS 2012 Local Workspace 92 | $tf/ 93 | 94 | # Guidance Automation Toolkit 95 | *.gpState 96 | 97 | # ReSharper is a .NET coding add-in 98 | _ReSharper*/ 99 | *.[Rr]e[Ss]harper 100 | *.DotSettings.user 101 | 102 | # JustCode is a .NET coding add-in 103 | .JustCode 104 | 105 | # TeamCity is a build add-in 106 | _TeamCity* 107 | 108 | # DotCover is a Code Coverage Tool 109 | *.dotCover 110 | 111 | # NCrunch 112 | _NCrunch_* 113 | .*crunch*.local.xml 114 | nCrunchTemp_* 115 | 116 | # MightyMoose 117 | *.mm.* 118 | AutoTest.Net/ 119 | 120 | # Web workbench (sass) 121 | .sass-cache/ 122 | 123 | # Installshield output folder 124 | [Ee]xpress/ 125 | 126 | # DocProject is a documentation generator add-in 127 | DocProject/buildhelp/ 128 | DocProject/Help/*.HxT 129 | DocProject/Help/*.HxC 130 | DocProject/Help/*.hhc 131 | DocProject/Help/*.hhk 132 | DocProject/Help/*.hhp 133 | DocProject/Help/Html2 134 | DocProject/Help/html 135 | 136 | # Click-Once directory 137 | publish/ 138 | 139 | # Publish Web Output 140 | *.[Pp]ublish.xml 141 | *.azurePubxml 142 | 143 | # TODO: Un-comment the next line if you do not want to checkin 144 | # your web deploy settings because they may include unencrypted 145 | # passwords 146 | #*.pubxml 147 | *.publishproj 148 | 149 | # NuGet Packages 150 | *.nupkg 151 | # The packages folder can be ignored because of Package Restore 152 | **/packages/* 153 | # except build/, which is used as an MSBuild target. 154 | !**/packages/build/ 155 | # Uncomment if necessary however generally it will be regenerated when needed 156 | #!**/packages/repositories.config 157 | # NuGet v3's project.json files produces more ignoreable files 158 | *.nuget.props 159 | *.nuget.targets 160 | 161 | # Microsoft Azure Build Output 162 | csx/ 163 | *.build.csdef 164 | 165 | # Microsoft Azure Emulator 166 | ecf/ 167 | rcf/ 168 | 169 | # Windows Store app package directory 170 | AppPackages/ 171 | BundleArtifacts/ 172 | 173 | # Visual Studio cache files 174 | # files ending in .cache can be ignored 175 | *.[Cc]ache 176 | # but keep track of directories ending in .cache 177 | !*.[Cc]ache/ 178 | 179 | # Others 180 | ClientBin/ 181 | [Ss]tyle[Cc]op.* 182 | ~$* 183 | *~ 184 | *.dbmdl 185 | *.dbproj.schemaview 186 | *.pfx 187 | *.publishsettings 188 | node_modules/ 189 | orleans.codegen.cs 190 | 191 | # RIA/Silverlight projects 192 | Generated_Code/ 193 | 194 | # Backup & report files from converting an old project file 195 | # to a newer Visual Studio version. Backup files are not needed, 196 | # because we have git ;-) 197 | _UpgradeReport_Files/ 198 | Backup*/ 199 | UpgradeLog*.XML 200 | UpgradeLog*.htm 201 | 202 | # SQL Server files 203 | *.mdf 204 | *.ldf 205 | 206 | # Business Intelligence projects 207 | *.rdl.data 208 | *.bim.layout 209 | *.bim_*.settings 210 | 211 | # Microsoft Fakes 212 | FakesAssemblies/ 213 | 214 | # GhostDoc plugin setting file 215 | *.GhostDoc.xml 216 | 217 | # Node.js Tools for Visual Studio 218 | .ntvs_analysis.dat 219 | 220 | # Visual Studio 6 build log 221 | *.plg 222 | 223 | # Visual Studio 6 workspace options file 224 | *.opt 225 | 226 | # Visual Studio LightSwitch build output 227 | **/*.HTMLClient/GeneratedArtifacts 228 | **/*.DesktopClient/GeneratedArtifacts 229 | **/*.DesktopClient/ModelManifest.xml 230 | **/*.Server/GeneratedArtifacts 231 | **/*.Server/ModelManifest.xml 232 | _Pvt_Extensions 233 | 234 | # LightSwitch generated files 235 | GeneratedArtifacts/ 236 | ModelManifest.xml 237 | 238 | # Paket dependency manager 239 | .paket/paket.exe 240 | 241 | # FAKE - F# Make 242 | .fake/ 243 | -------------------------------------------------------------------------------- /CSharpAlgorithm.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 14 4 | VisualStudioVersion = 14.0.25420.1 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpAlgorithm", "CSharpAlgorithm\CSharpAlgorithm.csproj", "{4FB9F31C-DEC0-4F45-8845-385DFC813A24}" 7 | EndProject 8 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{AA05A379-51BF-49DD-9750-330BBFFEF15E}" 9 | EndProject 10 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "doc", "doc", "{24E8BB80-23E4-4DFE-B9CC-EA992C306382}" 11 | ProjectSection(SolutionItems) = preProject 12 | 基于C#的23种设计模式.pdf = 基于C#的23种设计模式.pdf 13 | 数据结构与算法:C#语言描述(中文).pdf = 数据结构与算法:C#语言描述(中文).pdf 14 | EndProjectSection 15 | EndProject 16 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DesignMethod", "HE23DesignPatterns\DesignMethod.csproj", "{EADD02C1-97D4-469F-8C33-B52F289CB603}" 17 | EndProject 18 | Global 19 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 20 | Debug|Any CPU = Debug|Any CPU 21 | Release|Any CPU = Release|Any CPU 22 | EndGlobalSection 23 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 24 | {4FB9F31C-DEC0-4F45-8845-385DFC813A24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 25 | {4FB9F31C-DEC0-4F45-8845-385DFC813A24}.Debug|Any CPU.Build.0 = Debug|Any CPU 26 | {4FB9F31C-DEC0-4F45-8845-385DFC813A24}.Release|Any CPU.ActiveCfg = Release|Any CPU 27 | {4FB9F31C-DEC0-4F45-8845-385DFC813A24}.Release|Any CPU.Build.0 = Release|Any CPU 28 | {EADD02C1-97D4-469F-8C33-B52F289CB603}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 29 | {EADD02C1-97D4-469F-8C33-B52F289CB603}.Debug|Any CPU.Build.0 = Debug|Any CPU 30 | {EADD02C1-97D4-469F-8C33-B52F289CB603}.Release|Any CPU.ActiveCfg = Release|Any CPU 31 | {EADD02C1-97D4-469F-8C33-B52F289CB603}.Release|Any CPU.Build.0 = Release|Any CPU 32 | EndGlobalSection 33 | GlobalSection(SolutionProperties) = preSolution 34 | HideSolutionNode = FALSE 35 | EndGlobalSection 36 | GlobalSection(NestedProjects) = preSolution 37 | {4FB9F31C-DEC0-4F45-8845-385DFC813A24} = {AA05A379-51BF-49DD-9750-330BBFFEF15E} 38 | {EADD02C1-97D4-469F-8C33-B52F289CB603} = {AA05A379-51BF-49DD-9750-330BBFFEF15E} 39 | EndGlobalSection 40 | EndGlobal 41 | -------------------------------------------------------------------------------- /CSharpAlgorithm/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /CSharpAlgorithm/CSharpAlgorithm.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {4FB9F31C-DEC0-4F45-8845-385DFC813A24} 8 | Exe 9 | Properties 10 | CSharpAlgorithm 11 | CSharpAlgorithm 12 | v4.5 13 | 512 14 | 15 | 16 | AnyCPU 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | AnyCPU 27 | pdbonly 28 | true 29 | bin\Release\ 30 | TRACE 31 | prompt 32 | 4 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | {EADD02C1-97D4-469F-8C33-B52F289CB603} 77 | DesignMethod 78 | 79 | 80 | 81 | 88 | -------------------------------------------------------------------------------- /CSharpAlgorithm/Combine/PermutationAndCombination.cs: -------------------------------------------------------------------------------- 1 | /* ============================================================================== 2 | * 命名空间:CSharpAlgorithm 3 | * 类 名 称:PermutationAndCombination 4 | * 创 建 者:Qing 5 | * 创建时间:2018-05-06 13:09:59 6 | * CLR 版本:4.0.30319.42000 7 | * 保存的文件名:PermutationAndCombination 8 | * 文件版本:V1.0.0.0 9 | * 10 | * 功能描述:N/A 11 | * 12 | * 修改历史: 13 | * 14 | * 15 | * ============================================================================== 16 | * CopyRight @ 班纳工作室 2018. All rights reserved 17 | * ==============================================================================*/ 18 | 19 | 20 | using System; 21 | using System.Collections.Generic; 22 | using System.Linq; 23 | using System.Text; 24 | using System.Threading.Tasks; 25 | 26 | namespace CSharpAlgorithm 27 | { 28 | /** 排列组合的概念 29 | * 排列:从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列(Arrangement)。 30 | * 组合:从m个不同的元素中,任取n(n≤m)个元素为一组,叫作从m个不同元素中取出n个元素的一个组合。 31 | */ 32 | public class PermutationAndCombination 33 | { 34 | /// 35 | /// 交换两个变量 36 | /// 37 | /// 变量1 38 | /// 变量2 39 | public static void Swap(ref T a, ref T b) 40 | { 41 | T temp = a; 42 | a = b; 43 | b = temp; 44 | } 45 | /// 46 | /// 递归算法求数组的组合(私有成员) 47 | /// 48 | /// 返回的范型 49 | /// 所求数组 50 | /// 辅助变量 51 | /// 辅助变量 52 | /// 辅助数组 53 | /// 辅助变量M 54 | private static void GetCombination(ref List list, T[] t, int n, int m, int[] b, int M) 55 | { 56 | for (int i = n; i >= m; i--) 57 | { 58 | b[m - 1] = i - 1; 59 | if (m > 1) 60 | { 61 | GetCombination(ref list, t, i - 1, m - 1, b, M); 62 | } 63 | else 64 | { 65 | if (list == null) 66 | { 67 | list = new List(); 68 | } 69 | T[] temp = new T[M]; 70 | for (int j = 0; j < b.Length; j++) 71 | { 72 | temp[j] = t[b[j]]; 73 | } 74 | list.Add(temp); 75 | } 76 | } 77 | } 78 | /// 79 | /// 递归算法求排列(私有成员) 80 | /// 81 | /// 返回的列表 82 | /// 所求数组 83 | /// 起始标号 84 | /// 结束标号 85 | private static void GetPermutation(ref List list, T[] t, int startIndex, int endIndex) 86 | { 87 | if (startIndex == endIndex) 88 | { 89 | if (list == null) 90 | { 91 | list = new List(); 92 | } 93 | T[] temp = new T[t.Length]; 94 | t.CopyTo(temp, 0); 95 | list.Add(temp); 96 | } 97 | else 98 | { 99 | for (int i = startIndex; i <= endIndex; i++) 100 | { 101 | Swap(ref t[startIndex], ref t[i]); 102 | GetPermutation(ref list, t, startIndex + 1, endIndex); 103 | Swap(ref t[startIndex], ref t[i]); 104 | } 105 | } 106 | } 107 | 108 | /// 109 | /// 求从起始标号到结束标号的排列,其余元素不变 110 | /// 111 | /// 所求数组 112 | /// 起始标号 113 | /// 结束标号 114 | /// 从起始标号到结束标号排列的范型 115 | public static List GetPermutation(T[] t, int startIndex, int endIndex) 116 | { 117 | if (startIndex < 0 || endIndex > t.Length - 1) 118 | { 119 | return null; 120 | } 121 | List list = new List(); 122 | GetPermutation(ref list, t, startIndex, endIndex); 123 | return list; 124 | } 125 | 126 | /// 127 | /// 返回数组所有元素的全排列 128 | /// 129 | /// 所求数组 130 | /// 全排列的范型 131 | public static List GetPermutation(T[] t) 132 | { 133 | return GetPermutation(t, 0, t.Length - 1); 134 | } 135 | 136 | /// 137 | /// 求数组中n个元素的排列 138 | /// 139 | /// 所求数组 140 | /// 元素个数 141 | /// 数组中n个元素的排列 142 | public static List GetPermutation(T[] t, int n) 143 | { 144 | if (n > t.Length) 145 | { 146 | return null; 147 | } 148 | List list = new List(); 149 | List c = GetCombination(t, n); 150 | foreach (var t1 in c) 151 | { 152 | List l = new List(); 153 | GetPermutation(ref l, t1, 0, n - 1); 154 | list.AddRange(l); 155 | } 156 | return list; 157 | } 158 | 159 | /// 160 | /// 求数组中n个元素的组合 161 | /// 162 | /// 所求数组 163 | /// 元素个数 164 | /// 数组中n个元素的组合的范型 165 | public static List GetCombination(T[] t, int n) 166 | { 167 | if (t.Length < n) 168 | { 169 | return null; 170 | } 171 | int[] temp = new int[n]; 172 | List list = new List(); 173 | GetCombination(ref list, t, t.Length, n, temp, n); 174 | return list; 175 | } 176 | 177 | 178 | static void TestPermutation(string[] args) 179 | { 180 | #region 排列 181 | // 求排列:5个数取3个的任意排列 182 | int[] IntArr = new int[] { 1, 2, 3, 4, 5 }; //整型数组 183 | List ListCombination = PermutationAndCombination.GetPermutation(IntArr, 3); //求全部的5取3排列 184 | foreach (int[] arr in ListCombination) 185 | { 186 | foreach (int item in arr) 187 | { 188 | Console.Write(item + " "); 189 | } 190 | Console.WriteLine(""); 191 | } 192 | #endregion 193 | 194 | } 195 | 196 | static void TestCombination(string[] args) 197 | { 198 | #region 组合 199 | // 求组合:求5个数里任意3个数的组合 200 | int[] IntArr = new int[] { 1, 2, 3, 4, 5 }; //整型数组 201 | List ListCombination = PermutationAndCombination.GetCombination(IntArr, 3); //求全部的3-3组合 202 | foreach (int[] arr in ListCombination) 203 | { 204 | foreach (int item in arr) 205 | { 206 | Console.Write(item + " "); 207 | } 208 | Console.WriteLine(""); 209 | } 210 | Console.ReadKey(); 211 | #endregion 212 | } 213 | 214 | } 215 | } 216 | -------------------------------------------------------------------------------- /CSharpAlgorithm/DbList/DbNode.cs: -------------------------------------------------------------------------------- 1 | /* ============================================================================== 2 | * 命名空间:CSharpAlgorithm 3 | * 类 名 称:DbNode 4 | * 创 建 者:Qing 5 | * 创建时间:2018-05-06 15:15:15 6 | * CLR 版本:4.0.30319.42000 7 | * 保存的文件名:DbNode 8 | * 文件版本:V1.0.0.0 9 | * 10 | * 功能描述:N/A 11 | * 12 | * 修改历史: 13 | * 14 | * 15 | * ============================================================================== 16 | * CopyRight @ 班纳工作室 2018. All rights reserved 17 | * ==============================================================================*/ 18 | 19 | 20 | using System; 21 | using System.Collections.Generic; 22 | using System.Linq; 23 | using System.Text; 24 | using System.Threading.Tasks; 25 | 26 | /** 27 | * 数据结构C#版笔记--双向链表(DbLinkList) - 菩提树下的杨过 - 博客园 http://www.cnblogs.com/yjmyzz/archive/2010/10/24/1859689.html 28 | */ 29 | namespace CSharpAlgorithm 30 | { 31 | /// 32 | /// DbNode定义 33 | /// 34 | /// 35 | public class DbNode 36 | { 37 | private T data; 38 | private DbNode prev; 39 | private DbNode next; 40 | 41 | 42 | public DbNode(T data, DbNode next, DbNode prev) 43 | { 44 | this.data = data; 45 | this.next = next; 46 | this.prev = prev; 47 | } 48 | 49 | public DbNode(T data, DbNode next) 50 | { 51 | this.data = data; 52 | this.next = next; 53 | this.prev = null; 54 | } 55 | 56 | public DbNode(DbNode next) 57 | { 58 | this.data = default(T); 59 | this.next = next; 60 | this.prev = null; 61 | } 62 | 63 | public DbNode(T data) 64 | { 65 | this.data = data; 66 | this.next = null; 67 | this.prev = null; 68 | } 69 | 70 | public DbNode() 71 | { 72 | data = default(T); 73 | next = null; 74 | prev = null; 75 | } 76 | 77 | public T Data 78 | { 79 | set { this.data = value; } 80 | get { return this.data; } 81 | } 82 | 83 | public DbNode Prev 84 | { 85 | get { return prev; } 86 | set { prev = value; } 87 | } 88 | 89 | public DbNode Next 90 | { 91 | get { return next; } 92 | set { next = value; } 93 | } 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /CSharpAlgorithm/Dijkstra/Dijkstra.cs: -------------------------------------------------------------------------------- 1 | /* ============================================================================== 2 | * 命名空间:CSharpAlgorithm 3 | * 类 名 称:Dijkstra 4 | * 创 建 者:Qing 5 | * 创建时间:2018-05-06 16:39:18 6 | * CLR 版本:4.0.30319.42000 7 | * 保存的文件名:Dijkstra 8 | * 文件版本:V1.0.0.0 9 | * 10 | * 功能描述:N/A 11 | * 12 | * 修改历史: 13 | * 14 | * 15 | * ============================================================================== 16 | * CopyRight @ 班纳工作室 2018. All rights reserved 17 | * ==============================================================================*/ 18 | 19 | 20 | using System; 21 | using System.Collections.Generic; 22 | using System.Linq; 23 | using System.Text; 24 | using System.Threading.Tasks; 25 | 26 | namespace CSharpAlgorithm 27 | { 28 | /// 29 | /// Dijkstra(迪杰斯特拉)最短路径算法 https://mp.weixin.qq.com/s/wqwZf6wa52NGAHfSfQkZwA 30 | /// 31 | public class Dijkstra 32 | { 33 | public int Rank { get; set; } 34 | public int[] D { get; set; } 35 | public int[] C { get; set; } 36 | public int[,] L { get; set; } 37 | 38 | public Dijkstra(int rankparam, int[,] paramarr) 39 | { 40 | Rank = rankparam; 41 | C = new int[rankparam]; 42 | D = new int[rankparam]; 43 | L = paramarr; 44 | for (int i = 0; i < rankparam; i++) 45 | { 46 | C[i] = i; 47 | } 48 | C[0] = -1; 49 | for (int j = 1; j < rankparam; j++) 50 | { 51 | D[j] = L[0, j]; 52 | } 53 | } 54 | 55 | public void Display() 56 | { 57 | for (int i = 1; i < Rank; i++) 58 | { 59 | Console.WriteLine($"第{i}次遍历:"); 60 | DijkstraSolving(); 61 | foreach (int t in D) 62 | { 63 | Console.Write(t + " "); 64 | } 65 | Console.WriteLine(); 66 | foreach (var t in C) 67 | { 68 | Console.Write(t + " "); 69 | } 70 | Console.WriteLine(); 71 | } 72 | } 73 | 74 | public void DijkstraSolving() 75 | { 76 | int minValue = int.MaxValue; 77 | int minNode = 0; 78 | for (int i = 0; i < this.Rank; i++) 79 | { 80 | if (C[i] == -1) 81 | { 82 | continue; 83 | } 84 | if (D[i] > 0 && D[i] < minValue) 85 | { 86 | minValue = D[i]; 87 | minNode = i; 88 | } 89 | } 90 | C[minNode] = -1; 91 | for (int i = 0; i < Rank; i++) 92 | { 93 | if (L[minNode, i] < 0) 94 | { 95 | continue; 96 | } 97 | if (D[i] < 0) 98 | { 99 | D[i] = minValue + L[minNode, i]; 100 | continue; 101 | } 102 | if (minValue + L[minNode, i] < D[i]) 103 | { 104 | D[i] = minValue + L[minNode, i]; 105 | } 106 | } 107 | } 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /CSharpAlgorithm/Graph/GraphTraverse.cs: -------------------------------------------------------------------------------- 1 | /* ============================================================================== 2 | * 命名空间:CSharpAlgorithm 3 | * 类 名 称:GraphTraverse 4 | * 创 建 者:Qing 5 | * 创建时间:2018-05-06 16:40:53 6 | * CLR 版本:4.0.30319.42000 7 | * 保存的文件名:GraphTraverse 8 | * 文件版本:V1.0.0.0 9 | * 10 | * 功能描述:N/A 11 | * 12 | * 修改历史: 13 | * 14 | * 15 | * ============================================================================== 16 | * CopyRight @ 班纳工作室 2018. All rights reserved 17 | * ==============================================================================*/ 18 | 19 | 20 | using System; 21 | using System.Collections.Generic; 22 | using System.Linq; 23 | using System.Text; 24 | using System.Threading.Tasks; 25 | 26 | 27 | /** 28 | * 数据结构图的遍历算法C#实现 https://mp.weixin.qq.com/s/msr5NS3XWW0ZjOGMtc5BBQ 29 | */ 30 | namespace CSharpAlgorithm 31 | { 32 | /// 33 | /// 图的遍历算法 34 | /// 35 | public class GraphTraverse 36 | { 37 | //图的邻接矩阵 38 | private int[,] L { get; set; } 39 | //顶点数组 40 | private string[] Vertexs { get; set; } 41 | //顶点的数量 42 | private int VerNum { get; set; } 43 | //已访问的数组 44 | private bool[] Visited { get; set; } 45 | 46 | public GraphTraverse(string[] vers, int[,] l) 47 | { 48 | Vertexs = vers; 49 | L = l; 50 | VerNum = vers.Length; 51 | Visited = new bool[VerNum]; 52 | } 53 | 54 | /// 55 | /// 深度优先遍历 56 | /// 57 | public void DFS() 58 | { 59 | 60 | for (int i = 0; i < Visited.Length; i++) 61 | { 62 | if (!Visited[i]) 63 | { 64 | DFS(i); 65 | } 66 | } 67 | 68 | } 69 | 70 | 71 | /// 72 | /// 广度优先遍历 73 | /// 74 | public void BFS() 75 | { 76 | var queue = new Queue(); 77 | for (int i = 0; i < VerNum; i++) 78 | { 79 | if (!Visited[i]) 80 | { 81 | Visited[i] = true; 82 | queue.Enqueue(i); 83 | } 84 | while (queue.Count > 0) 85 | { 86 | var node = queue.Dequeue(); 87 | Console.WriteLine(Vertexs[node]); 88 | for (int j = FindFirstVertex(node); j >= 0; j = FindNextVertex(node, j)) 89 | { 90 | if (!Visited[j]) 91 | { 92 | Visited[j] = true; 93 | queue.Enqueue(j); 94 | } 95 | } 96 | } 97 | } 98 | } 99 | 100 | 101 | private void DFS(int i) 102 | { 103 | Visited[i] = true; 104 | Console.WriteLine(Vertexs[i]); 105 | for (int j = FindFirstVertex(i); j >= 0; j = FindNextVertex(i, j)) 106 | { 107 | if (!Visited[j]) 108 | { 109 | DFS(j); 110 | } 111 | } 112 | } 113 | 114 | /// 115 | /// 找到与i相邻的下一个顶点 116 | /// 117 | /// 118 | /// 119 | /// 120 | private int FindNextVertex(int i, int k) 121 | { 122 | for (int j = k + 1; j < VerNum; j++) 123 | { 124 | if (L[i, j] > 0) 125 | { 126 | return j; 127 | } 128 | } 129 | return -1; 130 | } 131 | 132 | 133 | /// 134 | /// 找到与i相邻的第一个顶点 135 | /// 136 | /// 137 | /// 138 | private int FindFirstVertex(int i) 139 | { 140 | for (int j = 0; j < VerNum; j++) 141 | { 142 | if (L[i, j] > 0) 143 | { 144 | return j; 145 | } 146 | } 147 | return -1; 148 | } 149 | 150 | } 151 | } 152 | -------------------------------------------------------------------------------- /CSharpAlgorithm/Huffman/HuffNode.cs: -------------------------------------------------------------------------------- 1 | /* ============================================================================== 2 | * 命名空间:CSharpAlgorithm 3 | * 类 名 称:HuffNode 4 | * 创 建 者:Qing 5 | * 创建时间:2018-05-06 15:49:57 6 | * CLR 版本:4.0.30319.42000 7 | * 保存的文件名:HuffNode 8 | * 文件版本:V1.0.0.0 9 | * 10 | * 功能描述:N/A 11 | * 12 | * 修改历史: 13 | * 14 | * 15 | * ============================================================================== 16 | * CopyRight @ 班纳工作室 2018. All rights reserved 17 | * ==============================================================================*/ 18 | 19 | 20 | using System; 21 | using System.Collections.Generic; 22 | using System.Linq; 23 | using System.Text; 24 | using System.Threading.Tasks; 25 | 26 | /** 27 | * 数据结构C#版笔记--啥夫曼树(Huffman Tree)与啥夫曼编码(Huffman Encoding) - 菩提树下的杨过 - 博客园 http://www.cnblogs.com/yjmyzz/archive/2010/12/03/1895840.html 28 | */ 29 | namespace CSharpAlgorithm 30 | { 31 | public class HuffNode 32 | { 33 | private int weight;//权重值 34 | private int lChild;//左子节点的序号 35 | private int rChild;//右子节点的序号 36 | private int index;//本节点的序号 37 | 38 | public int Weight 39 | { 40 | get { return weight; } 41 | set { weight = value; } 42 | } 43 | 44 | public int LChild 45 | { 46 | get { return this.lChild; } 47 | set { lChild = value; } 48 | } 49 | 50 | public int RChild 51 | { 52 | get { return this.rChild; } 53 | set { rChild = value; } 54 | } 55 | 56 | public int Index 57 | { 58 | get { return this.index; } 59 | set { index = value; } 60 | } 61 | 62 | public HuffNode() 63 | { 64 | weight = 0; 65 | lChild = -1; 66 | rChild = -1; 67 | index = -1; 68 | } 69 | 70 | public HuffNode(int w, int lc, int rc, int p) 71 | { 72 | weight = w; 73 | lChild = lc; 74 | rChild = rc; 75 | index = p; 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /CSharpAlgorithm/Huffman/HuffmanTree.cs: -------------------------------------------------------------------------------- 1 | /* ============================================================================== 2 | * 命名空间:CSharpAlgorithm 3 | * 类 名 称:HuffmanTree 4 | * 创 建 者:Qing 5 | * 创建时间:2018-05-06 15:50:53 6 | * CLR 版本:4.0.30319.42000 7 | * 保存的文件名:HuffmanTree 8 | * 文件版本:V1.0.0.0 9 | * 10 | * 功能描述:N/A 11 | * 12 | * 修改历史: 13 | * 14 | * 15 | * ============================================================================== 16 | * CopyRight @ 班纳工作室 2018. All rights reserved 17 | * ==============================================================================*/ 18 | 19 | 20 | using System; 21 | using System.Collections.Generic; 22 | using System.Linq; 23 | using System.Text; 24 | using System.Threading.Tasks; 25 | 26 | /** 27 | * 数据结构C#版笔记--啥夫曼树(Huffman Tree)与啥夫曼编码(Huffman Encoding) - 菩提树下的杨过 - 博客园 http://www.cnblogs.com/yjmyzz/archive/2010/12/03/1895840.html 28 | */ 29 | namespace CSharpAlgorithm 30 | { 31 | /// 32 | /// 哈夫曼树Huffman tree 又称最优完全二叉树 33 | /// 34 | public class HuffmanTree 35 | { 36 | private List _tmp; 37 | private List _nodes; 38 | 39 | public HuffmanTree(params int[] weights) 40 | { 41 | if (weights.Length < 2) 42 | { 43 | throw new Exception("叶节点不能少于2个!"); 44 | } 45 | 46 | int n = weights.Length; 47 | 48 | Array.Sort(weights); 49 | 50 | //先生成叶子节点,并按weight从小到大排序 51 | List lstLeafs = new List(n); 52 | for (int i = 0; i < n; i++) 53 | { 54 | var node = new HuffNode(); 55 | node.Weight = weights[i]; 56 | node.Index = i; 57 | lstLeafs.Add(node); 58 | } 59 | 60 | 61 | //创建临时节点容器 62 | _tmp = new List(2 * n - 1); 63 | 64 | //真正存放所有节点的容器 65 | _nodes = new List(_tmp.Capacity); 66 | 67 | _tmp.AddRange(lstLeafs); 68 | _nodes.AddRange(_tmp); 69 | } 70 | 71 | /// 72 | /// 构造Huffman树 73 | /// 74 | public void Create() 75 | { 76 | while (this._tmp.Count > 1) 77 | { 78 | var tmp = new HuffNode(this._tmp[0].Weight + this._tmp[1].Weight, _tmp[0].Index, _tmp[1].Index, 79 | this._tmp.Max(c => c.Index) + 1); 80 | this._tmp.Add(tmp); 81 | this._nodes.Add(tmp); 82 | 83 | //删除已经处理过的二个节点 84 | this._tmp.RemoveAt(0); 85 | this._tmp.RemoveAt(0); 86 | 87 | 88 | //重新按权重值从小到大排序 89 | this._tmp = this._tmp.OrderBy(c => c.Weight).ToList(); 90 | } 91 | } 92 | 93 | /// 94 | /// 测试输出各节点的关键值(调试用) 95 | /// 96 | /// 97 | public override string ToString() 98 | { 99 | StringBuilder sb = new StringBuilder(); 100 | for (int i = 0; i < _nodes.Count; i++) 101 | { 102 | var n = _nodes[i]; 103 | sb.AppendLine("index:" + i + ",weight:" + n.Weight.ToString().PadLeft(2, ' ') + ",lChild_index:" + 104 | n.LChild.ToString().PadLeft(2, ' ') + ",rChild_index:" + 105 | n.RChild.ToString().PadLeft(2, ' ')); 106 | } 107 | 108 | return sb.ToString(); 109 | } 110 | 111 | 112 | static void Test(string[] args) 113 | { 114 | #region 哈夫曼 115 | HuffmanTree huffTree = new HuffmanTree(2, 1, 4, 3); 116 | huffTree.Create(); 117 | 118 | Console.WriteLine("最终树的节点值如下:"); 119 | Console.WriteLine(huffTree.ToString()); 120 | // 输出结果也许并不直观,对照下面这张图就明白了: 121 | // https://pic002.cnblogs.com/images/2010/27612/2010120513101331.png 122 | Console.ReadLine(); 123 | #endregion 124 | 125 | } 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /CSharpAlgorithm/List/IListDS.cs: -------------------------------------------------------------------------------- 1 | /* ============================================================================== 2 | * 命名空间:CSharpAlgorithm 3 | * 类 名 称:IListDS 4 | * 创 建 者:Qing 5 | * 创建时间:2018-05-06 14:39:55 6 | * CLR 版本:4.0.30319.42000 7 | * 保存的文件名:IListDS 8 | * 文件版本:V1.0.0.0 9 | * 10 | * 功能描述:N/A 11 | * 12 | * 修改历史: 13 | * 14 | * 15 | * ============================================================================== 16 | * CopyRight @ 班纳工作室 2018. All rights reserved 17 | * ==============================================================================*/ 18 | 19 | 20 | using System; 21 | using System.Collections.Generic; 22 | using System.Linq; 23 | using System.Text; 24 | using System.Threading.Tasks; 25 | 26 | /** 27 | * 数据结构C#版笔记--顺序表(SeqList) - 菩提树下的杨过 - 博客园 http://www.cnblogs.com/yjmyzz/archive/2010/10/17/1853376.html 28 | */ 29 | namespace CSharpAlgorithm 30 | { 31 | /// 32 | /// 定义线性表的通用接口IListDS(注:DS为DataStructure的缩写) 33 | /// 34 | /// 35 | public interface IListDS 36 | { 37 | //取得线性表的实际元素个数 38 | int Count(); 39 | 40 | //清空线性表 41 | void Clear(); 42 | 43 | //判断线性表是否为空 44 | bool IsEmpty(); 45 | 46 | //(在末端)追加元素 47 | void Append(T item); 48 | 49 | //在位置i“前面”插入元素item 50 | void InsertBefore(T item, int i); 51 | 52 | //在位置i“后面”插入元素item 53 | void InsertAfter(T item, int i); 54 | 55 | //删除索引i处的元素 56 | T RemoveAt(int i); 57 | 58 | //获得索引位置i处的元素 59 | T GetItemAt(int i); 60 | 61 | //返回元素value的索引 62 | int IndexOf(T value); 63 | 64 | //反转线性表的所有元素 65 | void Reverse(); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /CSharpAlgorithm/List/LinkList.cs: -------------------------------------------------------------------------------- 1 | /* ============================================================================== 2 | * 命名空间:CSharpAlgorithm 3 | * 类 名 称:LinkList 4 | * 创 建 者:Qing 5 | * 创建时间:2018-05-06 14:39:15 6 | * CLR 版本:4.0.30319.42000 7 | * 保存的文件名:LinkList 8 | * 文件版本:V1.0.0.0 9 | * 10 | * 功能描述:N/A 11 | * 12 | * 修改历史: 13 | * 14 | * 15 | * ============================================================================== 16 | * CopyRight @ 班纳工作室 2018. All rights reserved 17 | * ==============================================================================*/ 18 | 19 | 20 | using System; 21 | using System.Collections.Generic; 22 | using System.Linq; 23 | using System.Text; 24 | using System.Threading.Tasks; 25 | 26 | /** 27 | * 数据结构C#版笔记--单链表(LinkList) - 菩提树下的杨过 - 博客园 http://www.cnblogs.com/yjmyzz/archive/2010/10/17/1853562.html 28 | */ 29 | namespace CSharpAlgorithm 30 | { 31 | public class LinkList : IListDS 32 | { 33 | private LinkNode head; 34 | 35 | public LinkNode Head 36 | { 37 | get { return head; } 38 | set { head = value; } 39 | } 40 | 41 | public LinkList() 42 | { 43 | head = null; 44 | } 45 | 46 | /// 47 | /// 类索引器 48 | /// 49 | /// 50 | /// 51 | public T this[int index] 52 | { 53 | get 54 | { 55 | return this.GetItemAt(index); 56 | } 57 | } 58 | 59 | /// 60 | /// 返回单链表的长度 61 | /// 62 | /// 63 | public int Count() 64 | { 65 | LinkNode p = head; 66 | int len = 0; 67 | while (p != null) 68 | { 69 | len++; 70 | p = p.Next; 71 | } 72 | return len; 73 | } 74 | 75 | /// 76 | /// 清空 77 | /// 78 | public void Clear() 79 | { 80 | head = null; 81 | } 82 | 83 | /// 84 | /// 是否为空 85 | /// 86 | /// 87 | public bool IsEmpty() 88 | { 89 | return head == null; 90 | } 91 | 92 | /// 93 | /// 在最后附加元素 94 | /// 95 | /// 96 | public void Append(T item) 97 | { 98 | LinkNode d = new LinkNode(item); 99 | LinkNode n = new LinkNode(); 100 | 101 | if (head == null) 102 | { 103 | head = d; 104 | return; 105 | } 106 | 107 | n = head; 108 | while (n.Next != null) 109 | { 110 | n = n.Next; 111 | } 112 | n.Next = d; 113 | } 114 | 115 | //前插 116 | public void InsertBefore(T item, int i) 117 | { 118 | if (IsEmpty() || i < 0) 119 | { 120 | Console.WriteLine("List is empty or Position is error!"); 121 | return; 122 | } 123 | 124 | //在最开头插入 125 | if (i == 0) 126 | { 127 | LinkNode q = new LinkNode(item); 128 | q.Next = Head;//把"头"改成第二个元素 129 | head = q;//把自己设置为"头" 130 | return; 131 | } 132 | 133 | LinkNode n = head; 134 | LinkNode d = new LinkNode(); 135 | int j = 0; 136 | 137 | //找到位置i的前一个元素d 138 | while (n.Next != null && j < i) 139 | { 140 | d = n; 141 | n = n.Next; 142 | j++; 143 | } 144 | 145 | if (n.Next == null) //说明是在最后节点插入(即追加) 146 | { 147 | LinkNode q = new LinkNode(item); 148 | n.Next = q; 149 | q.Next = null; 150 | } 151 | else 152 | { 153 | if (j == i) 154 | { 155 | LinkNode q = new LinkNode(item); 156 | d.Next = q; 157 | q.Next = n; 158 | } 159 | } 160 | } 161 | 162 | /// 163 | /// 在位置i后插入元素item 164 | /// 165 | /// 166 | /// 167 | public void InsertAfter(T item, int i) 168 | { 169 | if (IsEmpty() || i < 0) 170 | { 171 | Console.WriteLine("List is empty or Position is error!"); 172 | return; 173 | } 174 | 175 | if (i == 0) 176 | { 177 | LinkNode q = new LinkNode(item); 178 | q.Next = head.Next; 179 | head.Next = q; 180 | return; 181 | } 182 | 183 | LinkNode p = head; 184 | int j = 0; 185 | 186 | while (p != null && j < i) 187 | { 188 | p = p.Next; 189 | j++; 190 | } 191 | if (j == i) 192 | { 193 | LinkNode q = new LinkNode(item); 194 | q.Next = p.Next; 195 | p.Next = q; 196 | } 197 | else 198 | { 199 | Console.WriteLine("Position is error!"); 200 | } 201 | } 202 | 203 | /// 204 | /// 删除位置i的元素 205 | /// 206 | /// 207 | /// 208 | public T RemoveAt(int i) 209 | { 210 | if (IsEmpty() || i < 0) 211 | { 212 | Console.WriteLine("Link is empty or Position is error!"); 213 | return default(T); 214 | } 215 | 216 | LinkNode q = new LinkNode(); 217 | if (i == 0) 218 | { 219 | q = head; 220 | head = head.Next; 221 | return q.Data; 222 | } 223 | 224 | LinkNode p = head; 225 | int j = 0; 226 | 227 | while (p.Next != null && j < i) 228 | { 229 | j++; 230 | q = p; 231 | p = p.Next; 232 | } 233 | 234 | if (j == i) 235 | { 236 | q.Next = p.Next; 237 | return p.Data; 238 | } 239 | else 240 | { 241 | Console.WriteLine("The node is not exist!"); 242 | return default(T); 243 | } 244 | } 245 | 246 | /// 247 | /// 获取指定位置的元素 248 | /// 249 | /// 250 | /// 251 | public T GetItemAt(int i) 252 | { 253 | if (IsEmpty()) 254 | { 255 | Console.WriteLine("List is empty!"); 256 | return default(T); 257 | } 258 | 259 | LinkNode p = new LinkNode(); 260 | p = head; 261 | 262 | if (i == 0) 263 | { 264 | return p.Data; 265 | } 266 | 267 | int j = 0; 268 | 269 | while (p.Next != null && j < i) 270 | { 271 | j++; 272 | p = p.Next; 273 | } 274 | 275 | if (j == i) 276 | { 277 | return p.Data; 278 | } 279 | else 280 | { 281 | Console.WriteLine("The node is not exist!"); 282 | return default(T); 283 | } 284 | } 285 | 286 | //按元素值查找索引 287 | public int IndexOf(T value) 288 | { 289 | if (IsEmpty()) 290 | { 291 | Console.WriteLine("List is Empty!"); 292 | return -1; 293 | } 294 | LinkNode p = new LinkNode(); 295 | p = head; 296 | int i = 0; 297 | while (!p.Data.Equals(value) && p.Next != null) 298 | { 299 | p = p.Next; 300 | i++; 301 | } 302 | return i; 303 | } 304 | 305 | /// 306 | /// 元素反转 307 | /// 308 | public void Reverse() 309 | { 310 | LinkList result = new LinkList(); 311 | LinkNode t = this.head; 312 | result.Head = new LinkNode(t.Data); 313 | t = t.Next; 314 | 315 | //(把当前链接的元素从head开始遍历,逐个插入到另一个空链表中,这样得到的新链表正好元素顺序跟原链表是相反的) 316 | while (t != null) 317 | { 318 | result.InsertBefore(t.Data, 0); 319 | t = t.Next; 320 | } 321 | this.head = result.head;//将原链表直接挂到"反转后的链表"上 322 | result = null;//显式清空原链表的引用,以便让GC能直接回收 323 | } 324 | 325 | 326 | public override string ToString() 327 | { 328 | StringBuilder sb = new StringBuilder(); 329 | LinkNode n = this.head; 330 | sb.Append(n.Data.ToString() + ","); 331 | while (n.Next != null) 332 | { 333 | sb.Append(n.Next.Data.ToString() + ","); 334 | n = n.Next; 335 | } 336 | return sb.ToString().TrimEnd(','); 337 | 338 | } 339 | 340 | 341 | static void Test(string[] args) 342 | { 343 | #region 单链表 344 | Console.WriteLine("-------------------------------------"); 345 | Console.WriteLine("单链表测试开始..."); 346 | LinkList link = new LinkList(); 347 | link.Head = new LinkNode("x"); 348 | link.InsertBefore("w", 0); 349 | link.InsertBefore("v", 0); 350 | link.Append("y"); 351 | link.InsertBefore("z", link.Count()); 352 | Console.WriteLine(link.Count());//5 353 | Console.WriteLine(link.ToString());//v,w,x,y,z 354 | Console.WriteLine(link[1]);//w 355 | Console.WriteLine(link[0]);//v 356 | Console.WriteLine(link[4]);//z 357 | Console.WriteLine(link.IndexOf("z"));//4 358 | Console.WriteLine(link.RemoveAt(2));//x 359 | Console.WriteLine(link.ToString());//v,w,y,z 360 | link.InsertBefore("x", 2); 361 | Console.WriteLine(link.ToString());//v,w,x,y,z 362 | Console.WriteLine(link.GetItemAt(2));//x 363 | link.Reverse(); 364 | Console.WriteLine(link.ToString());//z,y,x,w,v 365 | link.InsertAfter("1", 0); 366 | link.InsertAfter("2", 1); 367 | link.InsertAfter("6", 5); 368 | link.InsertAfter("8", 7); 369 | link.InsertAfter("A", 10);//Position is error! 370 | 371 | Console.WriteLine(link.ToString()); //z,1,2,y,x,w,6,v,8 372 | #endregion 373 | 374 | } 375 | } 376 | } 377 | -------------------------------------------------------------------------------- /CSharpAlgorithm/List/SeqList.cs: -------------------------------------------------------------------------------- 1 | /* ============================================================================== 2 | * 命名空间:CSharpAlgorithm 3 | * 类 名 称:SeqList 4 | * 创 建 者:Qing 5 | * 创建时间:2018-05-06 14:41:06 6 | * CLR 版本:4.0.30319.42000 7 | * 保存的文件名:SeqList 8 | * 文件版本:V1.0.0.0 9 | * 10 | * 功能描述:N/A 11 | * 12 | * 修改历史: 13 | * 14 | * 15 | * ============================================================================== 16 | * CopyRight @ 班纳工作室 2018. All rights reserved 17 | * ==============================================================================*/ 18 | 19 | 20 | using System; 21 | using System.Collections.Generic; 22 | using System.Linq; 23 | using System.Text; 24 | using System.Threading.Tasks; 25 | 26 | /** 27 | * 顺序表(SeqList)的实现 28 | * 数据结构C#版笔记--顺序表(SeqList) - 菩提树下的杨过 - 博客园 http://www.cnblogs.com/yjmyzz/archive/2010/10/17/1853376.html 29 | */ 30 | namespace CSharpAlgorithm 31 | { 32 | /// 33 | /// 顺序表 34 | /// 优点:读取元素时可直接定位,所以在某些操作(比如将顺序表元素反转合围)中,不需要完全遍历,循环次数(即时间复杂度)相对完全遍历而言能减少一半。 35 | /// 缺点:插入/删除元素,因为要保持其顺序性,所以后续元素需要移动,增加了时间开销。 36 | /// 37 | /// 38 | public class SeqList : IListDS 39 | { 40 | private int maxsize; 41 | private T[] data; 42 | private int last; 43 | 44 | //类索引器 45 | public T this[int index] 46 | { 47 | get 48 | { 49 | return this.GetItemAt(index); 50 | } 51 | set 52 | { 53 | if (index < 0 || index > last + 1) 54 | { 55 | Console.WriteLine("Position is error"); 56 | return; 57 | } 58 | data[index] = value; 59 | } 60 | } 61 | 62 | //最后一个元素的下标 63 | public int Last 64 | { 65 | get { return last; } 66 | } 67 | 68 | //最大容量 69 | public int Maxsize 70 | { 71 | get { return this.maxsize; } 72 | set { this.maxsize = value; } 73 | } 74 | 75 | //构造函数 76 | public SeqList(int size) 77 | { 78 | data = new T[size]; 79 | maxsize = size; 80 | last = -1; 81 | } 82 | 83 | //返回链表的实际长度 84 | public int Count() 85 | { 86 | return last + 1; 87 | } 88 | 89 | //清空 90 | public void Clear() 91 | { 92 | last = -1; 93 | } 94 | 95 | //是否空 96 | public bool IsEmpty() 97 | { 98 | return last == -1; 99 | } 100 | 101 | //是否满 102 | public bool IsFull() 103 | { 104 | return last == maxsize - 1; 105 | } 106 | 107 | //(在最后位置)追加元素 108 | public void Append(T item) 109 | { 110 | if (IsFull()) 111 | { 112 | Console.WriteLine("List is full"); 113 | return; 114 | } 115 | data[++last] = item; 116 | } 117 | 118 | /// 119 | ///前插 120 | /// 121 | /// 要插入的元素 122 | /// 要插入的位置索引 123 | public void InsertBefore(T item, int i) 124 | { 125 | if (IsFull()) 126 | { 127 | Console.WriteLine("List is full"); 128 | return; 129 | } 130 | 131 | if (i < 0 || i > last + 1) 132 | { 133 | Console.WriteLine("Position is error"); 134 | return; 135 | } 136 | 137 | if (i == last + 1) 138 | { 139 | data[last + 1] = item; 140 | } 141 | else 142 | { 143 | //位置i及i以后的元素,全部后移 144 | for (int j = last; j >= i; j--) 145 | { 146 | data[j + 1] = data[j]; 147 | } 148 | data[i] = item; 149 | } 150 | ++last; 151 | } 152 | 153 | /// 154 | /// 后插 155 | /// 156 | /// 157 | /// 158 | public void InsertAfter(T item, int i) 159 | { 160 | if (IsFull()) 161 | { 162 | Console.WriteLine("List is full"); 163 | return; 164 | } 165 | 166 | if (i < 0 || i > last) 167 | { 168 | Console.WriteLine("Position is error"); 169 | return; 170 | } 171 | 172 | if (i == last) 173 | { 174 | data[last + 1] = item; 175 | } 176 | else 177 | { 178 | //位置i以后的元素(不含位置i),全部后移 179 | for (int j = last; j > i; j--) 180 | { 181 | data[j + 1] = data[j]; 182 | } 183 | data[i + 1] = item; 184 | } 185 | ++last; 186 | } 187 | 188 | /// 189 | /// 删除元素 190 | /// 191 | /// 要删除的元素索引 192 | /// 193 | public T RemoveAt(int i) 194 | { 195 | T tmp = default(T); 196 | if (IsEmpty()) 197 | { 198 | Console.WriteLine("List is empty"); 199 | return tmp; 200 | } 201 | 202 | if (i < 0 || i > last) 203 | { 204 | Console.WriteLine("Position is error!"); 205 | return tmp; 206 | } 207 | 208 | if (i == last) 209 | { 210 | tmp = data[last]; 211 | } 212 | else 213 | { 214 | tmp = data[i]; 215 | //位置i以及i以后的元素前移 216 | for (int j = i; j <= last; j++) 217 | { 218 | data[j] = data[j + 1]; 219 | } 220 | } 221 | --last; 222 | return tmp; 223 | } 224 | 225 | /// 226 | /// 获取第几个位置的元素 227 | /// 228 | /// 第几个位置 229 | /// 230 | public T GetItemAt(int i) 231 | { 232 | if (IsEmpty() || (i < 0) || (i > last)) 233 | { 234 | Console.WriteLine("List is empty or Position is error!"); 235 | return default(T); 236 | } 237 | return data[i]; 238 | } 239 | 240 | /// 241 | /// 定位元素的下标索引 242 | /// 243 | /// 244 | /// 245 | public int IndexOf(T value) 246 | { 247 | if (IsEmpty()) 248 | { 249 | Console.WriteLine("List is Empty!"); 250 | return -1; 251 | } 252 | int i = 0; 253 | for (i = 0; i <= last; i++) 254 | { 255 | if (value.Equals(data[i])) 256 | { 257 | break; 258 | } 259 | } 260 | if (i > last) 261 | { 262 | return -1; 263 | } 264 | return i; 265 | } 266 | 267 | /// 268 | /// 元素反转 269 | /// 270 | public void Reverse() 271 | { 272 | T tmp = default(T); 273 | for (int i = 0; i <= last / 2; i++) 274 | { 275 | tmp = data[i]; 276 | data[i] = data[last - i]; 277 | data[last - i] = tmp; 278 | } 279 | } 280 | 281 | public override string ToString() 282 | { 283 | StringBuilder sb = new StringBuilder(); 284 | for (int i = 0; i <= last; i++) 285 | { 286 | sb.Append(data[i].ToString() + ","); 287 | } 288 | return sb.ToString().TrimEnd(','); 289 | } 290 | 291 | 292 | static void Test(string[] args) 293 | { 294 | #region 顺序表 295 | Console.WriteLine("顺序表测试开始..."); 296 | SeqList seq = new SeqList(10); 297 | 298 | seq.Append("x"); 299 | seq.InsertBefore("w", 0); 300 | seq.InsertBefore("v", 0); 301 | seq.Append("y"); 302 | seq.InsertBefore("z", seq.Count()); 303 | Console.WriteLine(seq.Count());//5 304 | Console.WriteLine(seq.ToString());//v,w,x,y,z 305 | Console.WriteLine(seq[1]);//w 306 | Console.WriteLine(seq[0]);//v 307 | Console.WriteLine(seq[4]);//z 308 | Console.WriteLine(seq.IndexOf("z"));//4 309 | Console.WriteLine(seq.RemoveAt(2));//x 310 | Console.WriteLine(seq.ToString());//v,w,y,z 311 | seq.InsertBefore("x", 2); 312 | Console.WriteLine(seq.ToString());//v,w,x,y,z 313 | Console.WriteLine(seq.GetItemAt(2));//x 314 | seq.Reverse(); 315 | Console.WriteLine(seq.ToString());//z,y,x,w,v 316 | 317 | seq.InsertAfter("z_1", 0); 318 | seq.InsertAfter("y_1", 2); 319 | seq.InsertAfter("v_1", seq.Count() - 1); 320 | Console.WriteLine(seq.ToString());//z,z_1,y,y_1,x,w,v,v_1 321 | #endregion 322 | } 323 | 324 | } 325 | } 326 | -------------------------------------------------------------------------------- /CSharpAlgorithm/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // 有关程序集的一般信息由以下 6 | // 控制。更改这些特性值可修改 7 | // 与程序集关联的信息。 8 | [assembly: AssemblyTitle("CSharpAlgorithm")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("CSharpAlgorithm")] 13 | [assembly: AssemblyCopyright("Copyright © 2018")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | //将 ComVisible 设置为 false 将使此程序集中的类型 18 | //对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, 19 | //请将此类型的 ComVisible 特性设置为 true。 20 | [assembly: ComVisible(false)] 21 | 22 | // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID 23 | [assembly: Guid("4fb9f31c-dec0-4f45-8845-385dfc813a24")] 24 | 25 | // 程序集的版本信息由下列四个值组成: 26 | // 27 | // 主版本 28 | // 次版本 29 | // 生成号 30 | // 修订号 31 | // 32 | //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, 33 | // 方法是按如下所示使用“*”: : 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /CSharpAlgorithm/Queue/CSeqQueue.cs: -------------------------------------------------------------------------------- 1 | /* ============================================================================== 2 | * 命名空间:CSharpAlgorithm 3 | * 类 名 称:CSeqQueue 4 | * 创 建 者:Qing 5 | * 创建时间:2018-05-06 14:59:52 6 | * CLR 版本:4.0.30319.42000 7 | * 保存的文件名:CSeqQueue 8 | * 文件版本:V1.0.0.0 9 | * 10 | * 功能描述:N/A 11 | * 12 | * 修改历史: 13 | * 14 | * 15 | * ============================================================================== 16 | * CopyRight @ 班纳工作室 2018. All rights reserved 17 | * ==============================================================================*/ 18 | 19 | 20 | using System; 21 | using System.Collections.Generic; 22 | using System.Linq; 23 | using System.Text; 24 | using System.Threading.Tasks; 25 | 26 | namespace CSharpAlgorithm 27 | { 28 | /// 29 | /// 循环顺序队列 30 | /// 31 | /// 32 | public class CSeqQueue :IQueue 33 | { 34 | private int maxsize; 35 | private T[] data; 36 | private int front; 37 | private int rear; 38 | 39 | 40 | public CSeqQueue(int size) 41 | { 42 | data = new T[size]; 43 | maxsize = size; 44 | front = rear = -1; 45 | } 46 | 47 | public int Count() 48 | { 49 | if (rear > front) 50 | { 51 | return rear - front; 52 | } 53 | else 54 | { 55 | return (rear - front + maxsize) % maxsize; 56 | } 57 | } 58 | 59 | 60 | public void Clear() 61 | { 62 | front = rear = -1; 63 | } 64 | 65 | public bool IsEmpty() 66 | { 67 | return front == rear; 68 | } 69 | 70 | public bool IsFull() 71 | { 72 | if (front != -1) //如果已经有元素出队过 73 | { 74 | return (rear + 1) % maxsize == front;//为了区分与IsEmpty的区别,有元素出队过以后,就只有浪费一个位置来保持逻辑正确性. 75 | } 76 | else 77 | { 78 | return rear == maxsize - 1; 79 | } 80 | } 81 | 82 | public void Enqueue(T item) 83 | { 84 | if (IsFull()) 85 | { 86 | Console.WriteLine("Queue is full"); 87 | return; 88 | } 89 | if (rear == maxsize - 1) //如果rear到头了,则循环重来(即解决伪满问题) 90 | { 91 | rear = 0; 92 | } 93 | else 94 | { 95 | rear++; 96 | } 97 | data[rear] = item; 98 | } 99 | 100 | 101 | public T Dequeue() 102 | { 103 | if (IsEmpty()) 104 | { 105 | Console.WriteLine("Queue is empty"); 106 | return default(T); 107 | } 108 | if (front == maxsize - 1) //如果front到头了,则重新置0 109 | { 110 | front = 0; 111 | } 112 | else 113 | { 114 | front++; 115 | } 116 | return data[front]; 117 | } 118 | 119 | public T Peek() 120 | { 121 | if (IsEmpty()) 122 | { 123 | Console.WriteLine("Queue is empty!"); 124 | return default(T); 125 | } 126 | return data[(front + 1) % maxsize]; 127 | } 128 | 129 | public override string ToString() 130 | { 131 | if (IsEmpty()) { return "queue is empty."; } 132 | 133 | StringBuilder sb = new StringBuilder(); 134 | 135 | if (rear > front) 136 | { 137 | for (int i = front + 1; i <= rear; i++) 138 | { 139 | sb.Append(this.data[i].ToString() + ","); 140 | } 141 | } 142 | else 143 | { 144 | for (int i = front + 1; i < maxsize; i++) 145 | { 146 | sb.Append(this.data[i].ToString() + ","); 147 | } 148 | 149 | for (int i = 0; i <= rear; i++) 150 | { 151 | sb.Append(this.data[i].ToString() + ","); 152 | } 153 | } 154 | return "front = " + this.front + " \t rear = " + this.rear + "\t count = " + this.Count() + "\t data = " + sb.ToString().Trim(','); 155 | } 156 | 157 | 158 | static void Test(string[] args) 159 | { 160 | #region 循环队列 161 | CSeqQueue queue = new CSeqQueue(5); 162 | queue.Enqueue(1); 163 | queue.Enqueue(2); 164 | queue.Enqueue(3); 165 | queue.Enqueue(4); 166 | Console.WriteLine(queue);//front = -1 rear = 3 count = 4 data = 1,2,3,4 167 | queue.Dequeue(); 168 | Console.WriteLine(queue);//front = 0 rear = 3 count = 3 data = 2,3,4 169 | queue.Dequeue(); 170 | Console.WriteLine(queue);//front = 1 rear = 3 count = 2 data = 3,4 171 | queue.Enqueue(5); 172 | Console.WriteLine(queue);//front = 1 rear = 4 count = 3 data = 3,4,5 173 | queue.Enqueue(6); 174 | Console.WriteLine(queue);//front = 1 rear = 0 count = 4 data = 3,4,5,6 175 | queue.Enqueue(7); //Queue is full 176 | Console.WriteLine(queue);//front = 1 rear = 0 count = 4 data = 3,4,5,6 177 | queue.Dequeue(); 178 | queue.Enqueue(7); 179 | Console.WriteLine(queue);//front = 2 rear = 1 count = 4 data = 4,5,6,7 180 | 181 | queue.Clear(); 182 | Console.WriteLine(queue);//queue is empty. 183 | 184 | queue.Enqueue(1); 185 | queue.Enqueue(2); 186 | queue.Enqueue(3); 187 | queue.Enqueue(4); 188 | Console.WriteLine(queue);//front = -1 rear = 3 count = 4 data = 1,2,3,4 189 | queue.Enqueue(5); 190 | Console.WriteLine(queue);//front = -1 rear = 4 count = 5 data = 1,2,3,4,5 191 | queue.Enqueue(6); //Queue is full 192 | Console.WriteLine(queue);//front = -1 rear = 4 count = 5 data = 1,2,3,4,5 193 | queue.Dequeue(); 194 | queue.Dequeue(); 195 | queue.Dequeue(); 196 | queue.Dequeue(); 197 | Console.WriteLine(queue);//front = 3 rear = 4 count = 1 data = 5 198 | queue.Dequeue(); 199 | Console.WriteLine(queue);//queue is empty. 200 | queue.Enqueue(0); 201 | queue.Enqueue(1); 202 | queue.Enqueue(2); 203 | queue.Enqueue(3); 204 | queue.Enqueue(4); //Queue is full 205 | Console.WriteLine(queue);//front = 4 rear = 3 count = 4 data = 0,1,2,3 206 | Console.WriteLine(queue.Peek());//0 207 | queue.Dequeue(); 208 | Console.WriteLine(queue);//front = 0 rear = 3 count = 3 data = 1,2,3 209 | queue.Dequeue(); 210 | Console.WriteLine(queue);//front = 1 rear = 3 count = 2 data = 2,3 211 | queue.Dequeue(); 212 | Console.WriteLine(queue);//front = 2 rear = 3 count = 1 data = 3 213 | queue.Dequeue(); 214 | Console.WriteLine(queue);//queue is empty. 215 | queue.Enqueue(9); 216 | Console.WriteLine(queue);//front = 3 rear = 4 count = 1 data = 9 217 | Console.ReadLine(); 218 | #endregion 219 | } 220 | } 221 | } 222 | -------------------------------------------------------------------------------- /CSharpAlgorithm/Queue/IQueue.cs: -------------------------------------------------------------------------------- 1 | /* ============================================================================== 2 | * 命名空间:CSharpAlgorithm 3 | * 类 名 称:IQuene 4 | * 创 建 者:Qing 5 | * 创建时间:2018-05-06 14:58:17 6 | * CLR 版本:4.0.30319.42000 7 | * 保存的文件名:IQuene 8 | * 文件版本:V1.0.0.0 9 | * 10 | * 功能描述:N/A 11 | * 12 | * 修改历史: 13 | * 14 | * 15 | * ============================================================================== 16 | * CopyRight @ 班纳工作室 2018. All rights reserved 17 | * ==============================================================================*/ 18 | 19 | 20 | using System; 21 | using System.Collections.Generic; 22 | using System.Linq; 23 | using System.Text; 24 | using System.Threading.Tasks; 25 | 26 | namespace CSharpAlgorithm 27 | { 28 | /** 29 | * 数据结构C#版笔记--队列(Quene) - 菩提树下的杨过 - 博客园 http://www.cnblogs.com/yjmyzz/archive/2010/11/04/1865733.html 30 | */ 31 | public interface IQueue 32 | { 33 | /// 34 | /// 取得队列实际元素的个数 35 | /// 36 | /// 37 | int Count(); 38 | 39 | /// 40 | /// 判断队列是否为空 41 | /// 42 | /// 43 | bool IsEmpty(); 44 | 45 | /// 46 | /// 清空队列 47 | /// 48 | void Clear(); 49 | 50 | /// 51 | /// 入队(即向队列尾部添加一个元素) 52 | /// 53 | /// 54 | void Enqueue(T item); 55 | 56 | /// 57 | /// 出队(即从队列头部删除一个元素) 58 | /// 59 | /// 60 | T Dequeue(); 61 | 62 | /// 63 | /// 取得队列头部第一元素 64 | /// 65 | /// 66 | T Peek(); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /CSharpAlgorithm/Queue/LinkQueue.cs: -------------------------------------------------------------------------------- 1 | /* ============================================================================== 2 | * 命名空间:CSharpAlgorithm 3 | * 类 名 称:LinkQueue 4 | * 创 建 者:Qing 5 | * 创建时间:2018-05-06 15:21:19 6 | * CLR 版本:4.0.30319.42000 7 | * 保存的文件名:LinkQueue 8 | * 文件版本:V1.0.0.0 9 | * 10 | * 功能描述:N/A 11 | * 12 | * 修改历史: 13 | * 14 | * 15 | * ============================================================================== 16 | * CopyRight @ 班纳工作室 2018. All rights reserved 17 | * ==============================================================================*/ 18 | 19 | 20 | using System; 21 | using System.Collections.Generic; 22 | using System.Linq; 23 | using System.Text; 24 | using System.Threading.Tasks; 25 | 26 | namespace CSharpAlgorithm 27 | { 28 | public class LinkQueue : IQueue 29 | { 30 | private LinkNode front;//队列头 31 | private LinkNode rear;//队列尾 32 | private int num;//队列元素个数 33 | 34 | /// 35 | /// 构造器 36 | /// 37 | public LinkQueue() 38 | { 39 | //初始时front,rear置为null,num置0 40 | front = rear = null; 41 | num = 0; 42 | } 43 | 44 | public int Count() 45 | { 46 | return this.num; 47 | } 48 | 49 | 50 | public void Clear() 51 | { 52 | front = rear = null; 53 | num = 0; 54 | } 55 | 56 | public bool IsEmpty() 57 | { 58 | return (front == rear && num == 0); 59 | } 60 | 61 | //入队 62 | public void Enqueue(T item) 63 | { 64 | LinkNode q = new LinkNode(item); 65 | 66 | if (rear == null)//第一个元素入列时 67 | { 68 | front = rear = q; 69 | } 70 | else 71 | { 72 | //把新元素挂到链尾 73 | rear.Next = q; 74 | //修正rear指向为最后一个元素 75 | rear = q; 76 | } 77 | //元素总数+1 78 | num++; 79 | } 80 | 81 | //出队 82 | public T Dequeue() 83 | { 84 | if (IsEmpty()) 85 | { 86 | Console.WriteLine("Queue is empty!"); 87 | return default(T); 88 | } 89 | 90 | //取链首元素 91 | LinkNode p = front; 92 | 93 | //链头指向后移一位 94 | front = front.Next; 95 | 96 | //如果此时链表为空,则同步修正rear 97 | if (front == null) 98 | { 99 | rear = null; 100 | } 101 | 102 | num--;//个数-1 103 | 104 | return p.Data; 105 | } 106 | 107 | 108 | public T Peek() 109 | { 110 | if (IsEmpty()) 111 | { 112 | Console.WriteLine("Queue is empty!"); 113 | return default(T); 114 | } 115 | 116 | return front.Data; 117 | } 118 | 119 | 120 | public override string ToString() 121 | { 122 | if (IsEmpty()) 123 | { 124 | Console.WriteLine("Queue is empty!"); 125 | } 126 | 127 | StringBuilder sb = new StringBuilder(); 128 | 129 | LinkNode node = front; 130 | 131 | sb.Append(node.Data.ToString()); 132 | 133 | while (node.Next != null) 134 | { 135 | sb.Append("," + node.Next.Data.ToString()); 136 | node = node.Next; 137 | } 138 | 139 | return sb.ToString().Trim(','); 140 | } 141 | 142 | 143 | 144 | static void Test(string[] args) 145 | { 146 | #region 链式队列 147 | 148 | LinkQueue Lqueue = new LinkQueue(); 149 | Lqueue.Enqueue(1); 150 | Lqueue.Enqueue(2); 151 | Lqueue.Enqueue(3); 152 | Lqueue.Enqueue(4); 153 | Console.WriteLine(Lqueue); 154 | Lqueue.Dequeue(); 155 | Console.WriteLine(Lqueue); 156 | Console.WriteLine(Lqueue.Count()); 157 | 158 | #endregion 159 | } 160 | 161 | } 162 | } 163 | -------------------------------------------------------------------------------- /CSharpAlgorithm/Sort/QuickSort.cs: -------------------------------------------------------------------------------- 1 | /* ============================================================================== 2 | * 命名空间:CSharpAlgorithm.Sort 3 | * 类 名 称:QuickSort 4 | * 创 建 者:Qing 5 | * 创建时间:2018-05-06 18:30:12 6 | * CLR 版本:4.0.30319.42000 7 | * 保存的文件名:QuickSort 8 | * 文件版本:V1.0.0.0 9 | * 10 | * 功能描述:N/A 11 | * 12 | * 修改历史: 13 | * 14 | * 15 | * ============================================================================== 16 | * CopyRight @ 班纳工作室 2018. All rights reserved 17 | * ==============================================================================*/ 18 | 19 | 20 | using System; 21 | using System.Collections.Generic; 22 | using System.Linq; 23 | using System.Text; 24 | using System.Threading.Tasks; 25 | 26 | namespace CSharpAlgorithm 27 | { 28 | /* 今天介绍快速排序,这也是在实际中最常用的一种排序算法,速度快,效率高。就像名字一样,快速排序是最优秀的一种排序算法。 29 | * ********************************************************************************************************************************************************************************* 30 | * 31 | * 思想 32 | * 快速排序采用的思想是分治思想。 33 | * 快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。 34 | * 举例说明一下吧,这个可能不是太好理解。假设要排序的序列为 35 | * 2 2 4 9 3 6 7 1 5 首先用2当作基准,使用i j两个指针分别从两边进行扫描,把比2小的元素和比2大的元素分开。首先比较2和5,5比2大,j左移 36 | * 37 | * 2 2 4 9 3 6 7 1 5 比较2和1,1小于2,所以把1放在2的位置 38 | * 39 | * 2 1 4 9 3 6 7 1 5 比较2和4,4大于2,因此将4移动到后面 40 | * 41 | * 2 1 4 9 3 6 7 4 5 比较2和7,2和6,2和3,2和9,全部大于2,满足条件,因此不变 42 | * 43 | * 经过第一轮的快速排序,元素变为下面的样子 44 | * 45 | * [1] 2 [4 9 3 6 7 5] 46 | * 47 | * 之后,在把2左边的元素进行快排,由于只有一个元素,因此快排结束。右边进行快排,递归进行,最终生成最后的结果。 48 | ***********************************************************************************************************************************************************************************/ 49 | public class QuickSortAlgorithm 50 | { 51 | 52 | static void Test(string[] args) 53 | { 54 | int[] arr = { 5, 1, 3, 99, -5, 4, 2, 7, 9, 100 }; 55 | QuickSort(arr, 0, arr.Length - 1); 56 | foreach (var item in arr) 57 | { 58 | Console.Write(item + " "); 59 | } 60 | } 61 | 62 | private static int FindPos(int[] arr, int low, int hi) 63 | { 64 | var val = arr[low]; 65 | while (low < hi) 66 | { 67 | while (low < hi && arr[hi] >= val) 68 | { 69 | hi--; 70 | } 71 | arr[low] = arr[hi]; 72 | while (low < hi && arr[low] <= val) 73 | { 74 | low++; 75 | } 76 | arr[hi] = arr[low]; 77 | } 78 | arr[low] = val; 79 | return low; 80 | } 81 | 82 | 83 | private static void QuickSort(int[] arr, int low, int hi) 84 | { 85 | int pos = 0; 86 | if (hi > low) 87 | { 88 | pos = FindPos(arr, low, hi); 89 | QuickSort(arr, low, pos - 1); 90 | QuickSort(arr, pos + 1, hi); 91 | } 92 | } 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /CSharpAlgorithm/Stack/IStack.cs: -------------------------------------------------------------------------------- 1 | /* ============================================================================== 2 | * 命名空间:CSharpAlgorithm 3 | * 类 名 称:IStack 4 | * 创 建 者:Qing 5 | * 创建时间:2018-05-06 15:04:26 6 | * CLR 版本:4.0.30319.42000 7 | * 保存的文件名:IStack 8 | * 文件版本:V1.0.0.0 9 | * 10 | * 功能描述:N/A 11 | * 12 | * 修改历史: 13 | * 14 | * 15 | * ============================================================================== 16 | * CopyRight @ 班纳工作室 2018. All rights reserved 17 | * ==============================================================================*/ 18 | 19 | 20 | using System; 21 | using System.Collections.Generic; 22 | using System.Linq; 23 | using System.Text; 24 | using System.Threading.Tasks; 25 | 26 | namespace CSharpAlgorithm 27 | { 28 | /** 29 | * 数据结构C#版笔记--堆栈(Stack) - 菩提树下的杨过 - 博客园 http://www.cnblogs.com/yjmyzz/archive/2010/10/30/1865212.html 30 | */ 31 | public interface IStack 32 | { 33 | /// 34 | /// 返回堆栈的实际元素个数 35 | /// 36 | /// 37 | int Count(); 38 | 39 | /// 40 | /// 判断堆栈是否为空 41 | /// 42 | /// 43 | bool IsEmpty(); 44 | 45 | /// 46 | /// 清空堆栈里的元素 47 | /// 48 | void Clear(); 49 | 50 | /// 51 | /// 入栈:将元素压入堆栈中 52 | /// 53 | /// 54 | void Push(T item); 55 | 56 | /// 57 | /// 出栈:从堆栈顶取一个元素,并从堆栈中删除 58 | /// 59 | /// 60 | T Pop(); 61 | 62 | /// 63 | /// 取堆栈顶部的元素(但不删除) 64 | /// 65 | /// 66 | T Peek(); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /CSharpAlgorithm/Stack/LinkStack.cs: -------------------------------------------------------------------------------- 1 | /* ============================================================================== 2 | * 命名空间:CSharpAlgorithm 3 | * 类 名 称:LinkStack 4 | * 创 建 者:Qing 5 | * 创建时间:2018-05-06 15:05:37 6 | * CLR 版本:4.0.30319.42000 7 | * 保存的文件名:LinkStack 8 | * 文件版本:V1.0.0.0 9 | * 10 | * 功能描述:N/A 11 | * 12 | * 修改历史: 13 | * 14 | * 15 | * ============================================================================== 16 | * CopyRight @ 班纳工作室 2018. All rights reserved 17 | * ==============================================================================*/ 18 | 19 | 20 | using System; 21 | using System.Collections.Generic; 22 | using System.Linq; 23 | using System.Text; 24 | using System.Threading.Tasks; 25 | 26 | /** 27 | * 数据结构C#版笔记--堆栈(Stack) - 菩提树下的杨过 - 博客园 http://www.cnblogs.com/yjmyzz/archive/2010/10/30/1865212.html 28 | */ 29 | namespace CSharpAlgorithm 30 | { 31 | /// 32 | /// 链式堆栈(LinkStack)的实现 33 | /// 34 | public class LinkStack : IStack 35 | { 36 | private LinkNode top; 37 | private int num;//节点个数 38 | 39 | /// 40 | /// 顶部节点 41 | /// 42 | public LinkNode Top 43 | { 44 | get { return top; } 45 | set { top = value; } 46 | } 47 | 48 | 49 | public LinkStack() 50 | { 51 | top = null; 52 | num = 0; 53 | } 54 | 55 | public int Count() 56 | { 57 | return num; 58 | } 59 | 60 | public void Clear() 61 | { 62 | top = null; 63 | num = 0; 64 | } 65 | 66 | public bool IsEmpty() 67 | { 68 | if (top == null && num == 0) 69 | { 70 | return true; 71 | } 72 | else 73 | { 74 | return false; 75 | } 76 | } 77 | 78 | public void Push(T item) 79 | { 80 | LinkNode q = new LinkNode(item); 81 | if (top == null) 82 | { 83 | top = q; 84 | } 85 | else 86 | { 87 | q.Next = top; 88 | top = q; 89 | } 90 | num++; 91 | } 92 | 93 | public T Pop() 94 | { 95 | if (IsEmpty()) 96 | { 97 | Console.WriteLine("Stack is empty!"); 98 | return default(T); 99 | } 100 | LinkNode p = top; 101 | top = top.Next; 102 | num--; 103 | 104 | return p.Data; 105 | } 106 | 107 | public T Peek() 108 | { 109 | if (IsEmpty()) 110 | { 111 | Console.WriteLine("Stack is empty!"); 112 | return default(T); 113 | } 114 | return top.Data; 115 | } 116 | 117 | 118 | public override string ToString() 119 | { 120 | StringBuilder sb = new StringBuilder(); 121 | if (top != null) 122 | { 123 | sb.Append(top.Data.ToString() + ","); 124 | LinkNode p = top; 125 | while (p.Next != null) 126 | { 127 | sb.Append(p.Next.Data.ToString() + ","); 128 | p = p.Next; 129 | } 130 | } 131 | 132 | return sb.ToString(); 133 | } 134 | 135 | 136 | 137 | static void Test(string[] args) 138 | { 139 | #region 链堆栈 140 | Console.WriteLine("链堆栈测试开始..."); 141 | LinkStack linkStack = new LinkStack(); 142 | linkStack.Push(1); 143 | linkStack.Push(2); 144 | linkStack.Push(3); 145 | 146 | Console.WriteLine(linkStack); 147 | Console.WriteLine(linkStack.Peek()); 148 | Console.WriteLine(linkStack); 149 | Console.WriteLine(linkStack.Pop()); 150 | Console.WriteLine(linkStack); 151 | 152 | Console.ReadLine(); 153 | #endregion 154 | } 155 | } 156 | } 157 | -------------------------------------------------------------------------------- /CSharpAlgorithm/Stack/SeqStack.cs: -------------------------------------------------------------------------------- 1 | /* ============================================================================== 2 | * 命名空间:CSharpAlgorithm 3 | * 类 名 称:SeqStack 4 | * 创 建 者:Qing 5 | * 创建时间:2018-05-06 15:05:04 6 | * CLR 版本:4.0.30319.42000 7 | * 保存的文件名:SeqStack 8 | * 文件版本:V1.0.0.0 9 | * 10 | * 功能描述:N/A 11 | * 12 | * 修改历史: 13 | * 14 | * 15 | * ============================================================================== 16 | * CopyRight @ 班纳工作室 2018. All rights reserved 17 | * ==============================================================================*/ 18 | 19 | 20 | using System; 21 | using System.Collections.Generic; 22 | using System.Linq; 23 | using System.Text; 24 | using System.Threading.Tasks; 25 | 26 | /** 27 | * 数据结构C#版笔记--堆栈(Stack) - 菩提树下的杨过 - 博客园 http://www.cnblogs.com/yjmyzz/archive/2010/10/30/1865212.html 28 | */ 29 | namespace CSharpAlgorithm 30 | { 31 | /// 32 | /// 顺序堆栈(SeqStack)的实现 33 | /// 34 | /// 35 | public class SeqStack : IStack 36 | { 37 | private int maxsize; 38 | private T[] data; 39 | private int top; 40 | 41 | 42 | public SeqStack(int size) 43 | { 44 | data = new T[size]; 45 | maxsize = size; 46 | top = -1; 47 | } 48 | 49 | #region //接口实现部分 50 | public int Count() 51 | { 52 | return top + 1; 53 | } 54 | 55 | public void Clear() 56 | { 57 | top = -1; 58 | } 59 | 60 | public bool IsEmpty() 61 | { 62 | return top == -1; 63 | } 64 | 65 | public void Push(T item) 66 | { 67 | if (IsFull()) 68 | { 69 | Console.WriteLine("Stack is full"); 70 | return; 71 | } 72 | data[++top] = item; 73 | } 74 | 75 | 76 | public T Pop() 77 | { 78 | T tmp = default(T); 79 | if (IsEmpty()) 80 | { 81 | Console.WriteLine("Stack is empty"); 82 | return tmp; 83 | } 84 | tmp = data[top]; 85 | top--; 86 | return tmp; 87 | } 88 | 89 | public T Peek() 90 | { 91 | if (IsEmpty()) 92 | { 93 | Console.WriteLine("Stack is empty!"); 94 | return default(T); 95 | } 96 | return data[top]; 97 | } 98 | #endregion 99 | 100 | public bool IsFull() 101 | { 102 | return top == maxsize - 1; 103 | } 104 | 105 | 106 | public override string ToString() 107 | { 108 | StringBuilder sb = new StringBuilder(); 109 | for (int i = top; i >= 0; i--) 110 | { 111 | sb.Append(data[i] + ","); 112 | } 113 | return sb.ToString().Trim(','); 114 | } 115 | 116 | 117 | static void Test(string[] args) 118 | { 119 | #region 顺序堆栈 120 | Console.WriteLine("顺序堆栈测试开始..."); 121 | SeqStack seqStack = new SeqStack(10); 122 | seqStack.Push(1); 123 | seqStack.Push(2); 124 | seqStack.Push(3); 125 | 126 | Console.WriteLine(seqStack); 127 | Console.WriteLine(seqStack.Peek()); 128 | Console.WriteLine(seqStack); 129 | Console.WriteLine(seqStack.Pop()); 130 | Console.WriteLine(seqStack); 131 | 132 | #endregion 133 | } 134 | 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /CSharpAlgorithm/Tree/BiTree.cs: -------------------------------------------------------------------------------- 1 | /* ============================================================================== 2 | * 命名空间:CSharpAlgorithm 3 | * 类 名 称:BiTree 4 | * 创 建 者:Qing 5 | * 创建时间:2018-05-06 14:26:42 6 | * CLR 版本:4.0.30319.42000 7 | * 保存的文件名:BiTree 8 | * 文件版本:V1.0.0.0 9 | * 10 | * 功能描述:N/A 11 | * 12 | * 修改历史: 13 | * 14 | * 15 | * ============================================================================== 16 | * CopyRight @ 班纳工作室 2018. All rights reserved 17 | * ==============================================================================*/ 18 | 19 | 20 | using System; 21 | using System.Collections.Generic; 22 | using System.Linq; 23 | using System.Text; 24 | using System.Threading.Tasks; 25 | 26 | /** 27 | * 数据结构C#版笔记--树与二叉树 - 菩提树下的杨过 - 博客园 http://www.cnblogs.com/yjmyzz/archive/2010/12/01/1892403.html 28 | */ 29 | namespace CSharpAlgorithm 30 | { 31 | public class BiTree 32 | { 33 | private Node root; 34 | 35 | /// 36 | /// 根节点(属性) 37 | /// 38 | public Node Root 39 | { 40 | get { return root; } 41 | set { root = value; } 42 | } 43 | 44 | /// 45 | /// 构造函数 46 | /// 47 | public BiTree() 48 | { 49 | root = null; 50 | } 51 | 52 | /// 53 | /// 构造函数 54 | /// 55 | /// 56 | public BiTree(T data) 57 | { 58 | Node p = new Node(data); 59 | root = p; 60 | } 61 | 62 | /// 63 | /// 构造函数 64 | /// 65 | /// 66 | /// 67 | /// 68 | public BiTree(T data, Node ln, Node rn) 69 | { 70 | Node p = new Node(data, ln, rn); 71 | root = p; 72 | } 73 | 74 | /// 75 | /// 判断树是否为空 76 | /// 77 | /// 78 | public bool IsEmpty() 79 | { 80 | if (root == null) 81 | { 82 | return true; 83 | } 84 | else 85 | { 86 | return false; 87 | } 88 | } 89 | 90 | /// 91 | /// 获取节点p的左子节点 92 | /// 93 | /// 94 | /// 95 | public Node GetLChild(Node p) 96 | { 97 | return p.LChild; 98 | } 99 | 100 | /// 101 | /// 获取节点p的右子节点 102 | /// 103 | /// 104 | /// 105 | public Node GetRChild(Node p) 106 | { 107 | return p.RChild; 108 | } 109 | 110 | /// 111 | /// 节点p下插入左子节点data 112 | /// 113 | /// 114 | /// 115 | public void InsertL(T data, Node p) 116 | { 117 | Node tmp = new Node(data); 118 | tmp.LChild = p.LChild; 119 | p.LChild = tmp; 120 | } 121 | 122 | /// 123 | /// 节点p下插入右子节点data 124 | /// 125 | /// 126 | /// 127 | public void InsertR(T data, Node p) 128 | { 129 | Node tmp = new Node(data); 130 | tmp.RChild = p.RChild; 131 | p.RChild = tmp; 132 | } 133 | 134 | /// 135 | /// 删除节点p的左子节点 136 | /// 137 | /// 138 | /// 139 | public Node DeleteL(Node p) 140 | { 141 | if ((p == null) || (p.LChild == null)) 142 | { 143 | return null; 144 | } 145 | 146 | Node tmp = p.LChild; 147 | p.LChild = null; 148 | return tmp; 149 | } 150 | 151 | /// 152 | /// 删除节点p的右子节点 153 | /// 154 | /// 155 | /// 156 | public Node DeleteR(Node p) 157 | { 158 | if ((p == null) || (p.RChild == null)) 159 | { 160 | return null; 161 | } 162 | 163 | Node tmp = p.RChild; 164 | p.RChild = null; 165 | 166 | return tmp; 167 | } 168 | 169 | /// 170 | /// 判断节点p是否为叶节点 171 | /// 172 | /// 173 | /// 174 | public bool IsLeaf(Node p) 175 | { 176 | if ((p != null) && (p.LChild == null) && (p.RChild == null)) 177 | { 178 | return true; 179 | } 180 | else 181 | { 182 | return false; 183 | } 184 | } 185 | 186 | 187 | 188 | static void Test(string[] args) 189 | { 190 | #region 二叉树 191 | BiTree tree = new BiTree("A"); 192 | Node root = tree.Root; 193 | tree.InsertL("B", root); 194 | tree.InsertR("C", root); 195 | 196 | Node b = root.LChild; 197 | Node c = root.RChild; 198 | 199 | tree.InsertL("D", b); 200 | tree.InsertR("E", b); 201 | 202 | tree.InsertL("F", c); 203 | tree.InsertR("G", c); 204 | 205 | Node d = b.LChild; 206 | Node e = b.RChild; 207 | 208 | tree.InsertL("H", d); 209 | tree.InsertR("I", d); 210 | tree.InsertL("J", e); 211 | 212 | Console.WriteLine("前序遍历开始>>>\n"); 213 | //前序遍历 214 | PreOrder(root); 215 | 216 | Console.WriteLine("\n------------------------\n"); 217 | 218 | 219 | Console.WriteLine("中序遍历开始>>>\n"); 220 | //中序遍历 221 | InOrder(root); 222 | 223 | Console.WriteLine("\n------------------------\n"); 224 | Console.WriteLine("后序遍历开始>>>\n"); 225 | //后序遍历 226 | PostOrder(root); 227 | 228 | 229 | Console.WriteLine("\n------------------------\n"); 230 | Console.WriteLine("层序遍历开始>>>\n"); 231 | //后序遍历 232 | LevelOrder(root); 233 | 234 | Console.Read(); 235 | 236 | #endregion 237 | } 238 | 239 | 240 | #region 二叉树的前序、中序、后序遍历 241 | /// 242 | /// 前序遍历(即 root-->left-->right ) 243 | /// 244 | /// 245 | static void PreOrder(Node root) 246 | { 247 | if (root != null) 248 | { 249 | //先处理root 250 | Console.Write("{0} ", root.Data); 251 | 252 | //再处理root的左子节点 253 | PreOrder(root.LChild); 254 | 255 | //再处理root的右子节点 256 | PreOrder(root.RChild); 257 | } 258 | 259 | 260 | } 261 | 262 | /// 263 | /// 中序遍历(left-->root-->right) 264 | /// 265 | /// 266 | static void InOrder(Node root) 267 | { 268 | if (root == null) 269 | { 270 | return; 271 | } 272 | 273 | //先左子节点 274 | InOrder(root.LChild); 275 | 276 | //再根节点 277 | Console.Write("{0} ", root.Data); 278 | 279 | //再右子节点 280 | InOrder(root.RChild); 281 | } 282 | 283 | /// 284 | /// 后序遍历 285 | /// 286 | /// 287 | static void PostOrder(Node root) 288 | { 289 | if (root == null) 290 | { 291 | return; 292 | } 293 | 294 | PostOrder(root.LChild); 295 | PostOrder(root.RChild); 296 | Console.Write("{0} ", root.Data); 297 | } 298 | 299 | /// 300 | /// 层顺遍历 301 | /// 302 | /// 303 | static void LevelOrder(Node root) 304 | { 305 | if (root != null) 306 | { 307 | Queue> q = new Queue>(); 308 | 309 | q.Enqueue(root); 310 | 311 | while (q.Count > 0) 312 | { 313 | Node tmp = q.Dequeue(); 314 | 315 | //先处理根节点 316 | Console.Write("{0} ", tmp.Data); 317 | 318 | if (tmp.LChild != null) 319 | { 320 | //左子节点入队 321 | q.Enqueue(tmp.LChild); 322 | } 323 | 324 | if (tmp.RChild != null) 325 | { 326 | //右子节点入队 327 | q.Enqueue(tmp.RChild); 328 | } 329 | } 330 | } 331 | } 332 | #endregion 333 | 334 | } 335 | } 336 | -------------------------------------------------------------------------------- /CSharpAlgorithm/Tree/LinkNode.cs: -------------------------------------------------------------------------------- 1 | /* ============================================================================== 2 | * 命名空间:CSharpAlgorithm 3 | * 类 名 称:LinkNode 4 | * 创 建 者:Qing 5 | * 创建时间:2018-05-06 15:09:13 6 | * CLR 版本:4.0.30319.42000 7 | * 保存的文件名:LinkNode 8 | * 文件版本:V1.0.0.0 9 | * 10 | * 功能描述:N/A 11 | * 12 | * 修改历史: 13 | * 14 | * 15 | * ============================================================================== 16 | * CopyRight @ 班纳工作室 2018. All rights reserved 17 | * ==============================================================================*/ 18 | 19 | 20 | using System; 21 | using System.Collections.Generic; 22 | using System.Linq; 23 | using System.Text; 24 | using System.Threading.Tasks; 25 | 26 | /** 27 | * 数据结构C#版笔记--堆栈(Stack) - 菩提树下的杨过 - 博客园 http://www.cnblogs.com/yjmyzz/archive/2010/10/30/1865212.html 28 | */ 29 | namespace CSharpAlgorithm 30 | { 31 | /// 32 | /// 定义节点 LinkNode 33 | /// 34 | /// 35 | public class LinkNode 36 | { 37 | private T data; 38 | 39 | private LinkNode next; 40 | 41 | public LinkNode(T data, LinkNode next) 42 | { 43 | this.data = data; 44 | this.next = next; 45 | } 46 | 47 | public LinkNode(LinkNode next) 48 | { 49 | this.next = next; 50 | this.data = default(T); 51 | 52 | } 53 | 54 | public LinkNode(T data) 55 | { 56 | this.data = data; 57 | this.next = null; 58 | } 59 | 60 | public LinkNode() 61 | { 62 | this.data = default(T); 63 | this.next = null; 64 | } 65 | 66 | public T Data 67 | { 68 | get { return this.data; } 69 | set { this.data = value; } 70 | } 71 | 72 | public LinkNode Next 73 | { 74 | get { return next; } 75 | set { next = value; } 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /CSharpAlgorithm/Tree/Node.cs: -------------------------------------------------------------------------------- 1 | /* ============================================================================== 2 | * 命名空间:CSharpAlgorithm 3 | * 类 名 称:Node 4 | * 创 建 者:Qing 5 | * 创建时间:2018-05-06 14:27:52 6 | * CLR 版本:4.0.30319.42000 7 | * 保存的文件名:Node 8 | * 文件版本:V1.0.0.0 9 | * 10 | * 功能描述:N/A 11 | * 12 | * 修改历史: 13 | * 14 | * 15 | * ============================================================================== 16 | * CopyRight @ 班纳工作室 2018. All rights reserved 17 | * ==============================================================================*/ 18 | 19 | 20 | using System; 21 | using System.Collections.Generic; 22 | using System.Linq; 23 | using System.Text; 24 | using System.Threading.Tasks; 25 | 26 | /** 27 | * 数据结构C#版笔记--树与二叉树 - 菩提树下的杨过 - 博客园 http://www.cnblogs.com/yjmyzz/archive/2010/12/01/1892403.html 28 | */ 29 | namespace CSharpAlgorithm 30 | { 31 | public class Node 32 | { 33 | private T data; 34 | private Node lChild;//左子节点 35 | private Node rChild;//右子节点 36 | 37 | public Node(T data, Node ln, Node rn) 38 | { 39 | this.data = data; 40 | this.lChild = ln; 41 | this.rChild = rn; 42 | } 43 | 44 | public Node(Node ln, Node rn) 45 | { 46 | this.data = default(T); 47 | this.lChild = ln; 48 | this.rChild = rn; 49 | } 50 | 51 | public Node(T data) 52 | { 53 | this.data = data; 54 | lChild = null; 55 | rChild = null; 56 | } 57 | 58 | public Node() 59 | { 60 | data = default(T); 61 | lChild = null; 62 | rChild = null; 63 | } 64 | 65 | public T Data 66 | { 67 | get { return this.data; } 68 | set { this.data = value; } 69 | } 70 | 71 | public Node LChild 72 | { 73 | get { return this.lChild; } 74 | set { this.lChild = value; } 75 | } 76 | 77 | public Node RChild 78 | { 79 | get { return this.rChild; } 80 | set { this.rChild = value; } 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /HE23DesignPatterns/DesignMethod.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {EADD02C1-97D4-469F-8C33-B52F289CB603} 8 | Library 9 | Properties 10 | DesignMethod 11 | DesignMethod 12 | v4.5 13 | 512 14 | SAK 15 | SAK 16 | SAK 17 | SAK 18 | 19 | 20 | true 21 | full 22 | false 23 | bin\Debug\ 24 | DEBUG;TRACE 25 | prompt 26 | 4 27 | 28 | 29 | pdbonly 30 | true 31 | bin\Release\ 32 | TRACE 33 | prompt 34 | 4 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 115 | -------------------------------------------------------------------------------- /HE23DesignPatterns/OpenDesign.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :OpenDesign 4 | // created by 朱锦润 5 | // created time 2017/07/06 15:10:24 6 | //-------------------------------------------- 7 | 8 | namespace DesignMethod 9 | { 10 | public abstract class OpenDesign 11 | { 12 | public abstract void Open(); 13 | } 14 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // 有关程序集的常规信息通过以下 5 | // 特性集控制。更改这些特性值可修改 6 | // 与程序集关联的信息。 7 | [assembly: AssemblyTitle("DesignMethod")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("")] 11 | [assembly: AssemblyProduct("DesignMethod")] 12 | [assembly: AssemblyCopyright("Copyright © 2015")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // 将 ComVisible 设置为 false 使此程序集中的类型 17 | // 对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, 18 | // 则将该类型上的 ComVisible 特性设置为 true。 19 | [assembly: ComVisible(false)] 20 | 21 | // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID 22 | [assembly: Guid("d8cceb45-51ea-4dc1-bee9-66f986f97de6")] 23 | 24 | // 程序集的版本信息由下面四个值组成: 25 | // 26 | // 主版本 27 | // 次版本 28 | // 生成号 29 | // 修订号 30 | // 31 | // 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, 32 | // 方法是按如下所示使用“*”: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] -------------------------------------------------------------------------------- /HE23DesignPatterns/StartDesign.cs: -------------------------------------------------------------------------------- 1 | namespace DesignMethod 2 | { 3 | public class StartDesign 4 | { 5 | public void Go() 6 | { 7 | #region 创建型模式就是用来创建对象的模式,抽象了实例化的过程 6个 8 | 9 | //#region 单例模式 10 | //OpenDesign design = new 单例模式.Program(); 11 | //design.Open(); 12 | //#endregion 13 | 14 | //#region 简单工厂 15 | //OpenDesign design = new 简单工厂.Program(); 16 | //design.Open(); 17 | //#endregion 18 | 19 | //#region 工厂模式 20 | //OpenDesign design = new 工厂方法.Program(); 21 | //design.Open(); 22 | //#endregion 23 | 24 | //#region 抽象工厂模式 25 | //OpenDesign design = new 抽象工厂.Program(); 26 | //design.Open(); 27 | //#endregion 28 | 29 | //#region 建造者模式 30 | //OpenDesign design = new 建造者.Program(); 31 | //design.Open(); 32 | //#endregion 33 | 34 | //#region 原型模式 35 | //OpenDesign design = new 原型模式.Program(); 36 | //design.Open(); 37 | //#endregion 38 | 39 | #endregion 创建型模式就是用来创建对象的模式,抽象了实例化的过程 6个 40 | 41 | #region 结构型模式,顾名思义讨论的是类和对象的结构 ,主要用来处理类或对象的组合 7个 42 | 43 | //#region 适配器模式 44 | //OpenDesign design = new 适配器.Program(); 45 | //design.Open(); 46 | //#endregion 47 | 48 | //#region 桥接 49 | //OpenDesign design = new 桥接模式.Program(); 50 | //design.Open(); 51 | //#endregion 52 | 53 | //#region 装饰者 54 | //OpenDesign design = new 装饰者模式.Program(); 55 | //design.Open(); 56 | //#endregion 57 | 58 | //#region 组合模式 59 | //OpenDesign design = new 组合模式.Program(); 60 | //design.Open(); 61 | //#endregion 62 | 63 | //#region 外观模式 64 | //OpenDesign design = new 外观模式.Program(); 65 | //design.Open(); 66 | //#endregion 67 | 68 | //#region 享元模式 69 | //OpenDesign design = new 享元模式.Program(); 70 | //design.Open(); 71 | //#endregion 72 | 73 | //#region 代理模式 74 | //OpenDesign design = new 代理模式.Program(); 75 | //design.Open(); 76 | //#endregion 77 | 78 | #endregion 结构型模式,顾名思义讨论的是类和对象的结构 ,主要用来处理类或对象的组合 7个 79 | 80 | #region 行为型模式是对在不同对象之间划分责任和算法的抽象化。行为模式不仅仅关于类和对象,还关于它们之间的相互作用 11 81 | 82 | //#region 模板模式 83 | //OpenDesign design = new 模板模式.Program(); 84 | //design.Open(); 85 | //#endregion 86 | 87 | //#region 命令模式 88 | //OpenDesign design = new 命令模式.Program(); 89 | //design.Open(); 90 | //#endregion 91 | 92 | //#region 迭代器模式 93 | //OpenDesign design = new 迭代器模式.Program(); 94 | //design.Open(); 95 | //#endregion 96 | 97 | //#region 中介者模式 98 | //OpenDesign design = new 中介者模式.Program(); 99 | //design.Open(); 100 | //#endregion 101 | 102 | //#region 状态模式 103 | //OpenDesign design = new 状态模式.Program(); 104 | //design.Open(); 105 | //#endregion 106 | 107 | #region 观察者模式 108 | 109 | OpenDesign design = new 观察者模式.Program(); 110 | design.Open(); 111 | 112 | #endregion 观察者模式 113 | 114 | //#region 策略者模式 115 | //OpenDesign design = new 策略者模式.Program(); 116 | //design.Open(); 117 | //#endregion 118 | 119 | //#region 责任链模式 120 | //OpenDesign design = new 责任链模式.Program(); 121 | //design.Open(); 122 | //#endregion 123 | 124 | //#region 访问者模式 125 | //OpenDesign design = new 访问者模式.Program(); 126 | //design.Open(); 127 | //#endregion 128 | 129 | //#region 备忘录模式 130 | //OpenDesign design = new 备忘录模式.Program(); 131 | //design.Open(); 132 | //#endregion 133 | 134 | //#region 解释者模式 135 | //OpenDesign design = new 解释者模式.Program(); 136 | //design.Open(); 137 | //#endregion 138 | 139 | #endregion 行为型模式是对在不同对象之间划分责任和算法的抽象化。行为模式不仅仅关于类和对象,还关于它们之间的相互作用 11 140 | } 141 | } 142 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/中介者模式/Client.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Client 4 | // created by 朱锦润 5 | // created time 2017/07/07 13:17:45 6 | //-------------------------------------------- 7 | using System; 8 | using System.Collections.Generic; 9 | 10 | namespace DesignMethod.中介者模式 11 | { 12 | #region 未使用观察者模式和状态模式 13 | 14 | ////抽象类 15 | //public abstract class AbstractCardPartner 16 | //{ 17 | // public int MoneyCount { get; set; } 18 | // public AbstractCardPartner() 19 | // { 20 | // MoneyCount = 0; 21 | // } 22 | // public abstract void ChangeCount(int Count, AbstractMediator other); 23 | //} 24 | 25 | ////A 26 | //public class ParterA : AbstractCardPartner 27 | //{ 28 | // public override void ChangeCount(int Count, AbstractMediator other) 29 | // { 30 | // other.AWin(Count); 31 | // } 32 | //} 33 | 34 | ////B 35 | //public class ParterB : AbstractCardPartner 36 | //{ 37 | // public override void ChangeCount(int Count, AbstractMediator other) 38 | // { 39 | // other.BWin(Count); 40 | // } 41 | //} 42 | 43 | ////抽象中介者 44 | //public abstract class AbstractMediator 45 | //{ 46 | // protected AbstractCardPartner A; 47 | // protected AbstractCardPartner B; 48 | // public AbstractMediator(AbstractCardPartner a, AbstractCardPartner b) 49 | // { 50 | // A = a; 51 | // B = b; 52 | // } 53 | 54 | // public abstract void AWin(int count); 55 | // public abstract void BWin(int count); 56 | //} 57 | 58 | //public class Mediator : AbstractMediator 59 | //{ 60 | // public Mediator(AbstractCardPartner a, AbstractCardPartner b) : base(a, b) { } 61 | // public override void AWin(int count) 62 | // { 63 | // A.MoneyCount += count; 64 | // B.MoneyCount -= count; 65 | // } 66 | 67 | // public override void BWin(int count) 68 | // { 69 | // B.MoneyCount += count; 70 | // A.MoneyCount -= count; 71 | // } 72 | //} 73 | 74 | #endregion 未使用观察者模式和状态模式 75 | 76 | #region 使用观察者模式和状态模式完善中介者模式 77 | 78 | //抽象牌友类 79 | public abstract class AbstractCardPartner 80 | { 81 | public AbstractCardPartner() 82 | { 83 | MoneyCount = 0; 84 | } 85 | 86 | public int MoneyCount { get; set; } 87 | 88 | public abstract void ChangeCount(int Count, AbstractMediator mediator); 89 | } 90 | 91 | //抽象中介者 92 | public abstract class AbstractMediator 93 | { 94 | public List list = new List(); 95 | 96 | public AbstractMediator(State state) 97 | { 98 | this.State = state; 99 | } 100 | 101 | public State State { get; set; } 102 | 103 | public void ChangeCount(int Count) 104 | { 105 | State.ChangeCount(Count); 106 | } 107 | 108 | public void Enter(AbstractCardPartner partner) 109 | { 110 | list.Add(partner); 111 | } 112 | 113 | public void Exit(AbstractCardPartner partner) 114 | { 115 | list.Remove(partner); 116 | } 117 | } 118 | 119 | //A赢状态 120 | public class AWinState : State 121 | { 122 | public AWinState(AbstractMediator concretemediator) 123 | { 124 | this.mediator = concretemediator; 125 | } 126 | 127 | public override void ChangeCount(int Count) 128 | { 129 | foreach (AbstractCardPartner p in mediator.list) 130 | { 131 | ParterA a = p as ParterA; 132 | if (a != null) 133 | { 134 | a.MoneyCount += Count; 135 | } 136 | else 137 | { 138 | p.MoneyCount -= Count; 139 | } 140 | } 141 | } 142 | } 143 | 144 | //B赢状态 145 | public class BWinState : State 146 | { 147 | public BWinState(AbstractMediator concretemediator) 148 | { 149 | this.mediator = concretemediator; 150 | } 151 | 152 | public override void ChangeCount(int Count) 153 | { 154 | foreach (AbstractCardPartner p in mediator.list) 155 | { 156 | ParterB b = p as ParterB; 157 | if (b != null) 158 | { 159 | b.MoneyCount += Count; 160 | } 161 | else 162 | { 163 | p.MoneyCount -= Count; 164 | } 165 | } 166 | } 167 | } 168 | 169 | public class InitState : State 170 | { 171 | public InitState() 172 | { 173 | Console.WriteLine("游戏才刚刚开始,暂时还没有玩家胜出"); 174 | } 175 | 176 | public override void ChangeCount(int Count) 177 | { 178 | return; 179 | } 180 | } 181 | 182 | //具体中介者 183 | public class MediatorPater : AbstractMediator 184 | { 185 | public MediatorPater(State initState) 186 | : base(initState) 187 | { 188 | } 189 | } 190 | 191 | //牌友A类 192 | public class ParterA : AbstractCardPartner 193 | { 194 | //依赖与抽象中介者对象 195 | public override void ChangeCount(int Count, AbstractMediator mediator) 196 | { 197 | mediator.ChangeCount(Count); 198 | } 199 | } 200 | 201 | //牌友B类 202 | public class ParterB : AbstractCardPartner 203 | { 204 | public override void ChangeCount(int Count, AbstractMediator mediator) 205 | { 206 | mediator.ChangeCount(Count); 207 | } 208 | } 209 | 210 | //抽象状态类 211 | public abstract class State 212 | { 213 | protected AbstractMediator mediator; 214 | 215 | public abstract void ChangeCount(int Count); 216 | } 217 | 218 | #endregion 使用观察者模式和状态模式完善中介者模式 219 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/中介者模式/Program.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Program 4 | // created by 朱锦润 5 | // created time 2017/07/07 13:16:31 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.中介者模式 10 | { 11 | public class Program : OpenDesign 12 | { 13 | public override void Open() 14 | { 15 | #region 未使用观察者模式与状态者模式 16 | 17 | //AbstractCardPartner A = new ParterA(); 18 | //A.MoneyCount = 20; 19 | //AbstractCardPartner B = new ParterB(); 20 | //B.MoneyCount = 20; 21 | //AbstractMediator mediator = new Mediator(A, B); 22 | //mediator.AWin(5); 23 | //Console.WriteLine("A:{0}", A.MoneyCount); 24 | //Console.WriteLine("B:{0}", B.MoneyCount); 25 | //mediator.BWin(5); 26 | //Console.WriteLine("B:{0}", B.MoneyCount); 27 | //Console.WriteLine("A:{0}", A.MoneyCount); 28 | //Console.Read(); 29 | 30 | #endregion 未使用观察者模式与状态者模式 31 | 32 | #region 完善中介者模式 33 | 34 | AbstractCardPartner A = new ParterA(); 35 | AbstractCardPartner B = new ParterB(); 36 | // 初始钱 37 | A.MoneyCount = 20; 38 | B.MoneyCount = 20; 39 | AbstractMediator mediator = new MediatorPater(new InitState()); 40 | // A,B玩家进入平台进行游戏 41 | mediator.Enter(A); 42 | mediator.Enter(B); 43 | // A赢了 44 | mediator.State = new AWinState(mediator); 45 | mediator.ChangeCount(5); 46 | Console.WriteLine("A 现在的钱是:{0}", A.MoneyCount); 47 | // 应该是25 48 | Console.WriteLine("B 现在的钱是:{0}", B.MoneyCount); 49 | // 应该是15 50 | // B 赢了 51 | mediator.State = new BWinState(mediator); 52 | mediator.ChangeCount(10); 53 | Console.WriteLine("A 现在的钱是:{0}", A.MoneyCount); 54 | // 应该是25 55 | Console.WriteLine("B 现在的钱是:{0}", B.MoneyCount); 56 | // 应该是15 57 | Console.Read(); 58 | 59 | #endregion 完善中介者模式 60 | } 61 | } 62 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/享元模式/Client.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace DesignMethod.享元模式 5 | { 6 | //享元对象 7 | public class ConcreteFlyweight : Flyweight 8 | { 9 | private string intrinsicstate; 10 | 11 | public ConcreteFlyweight(string name) 12 | { 13 | this.intrinsicstate = name; 14 | } 15 | 16 | public override void Operation(int extrinsicstate) 17 | { 18 | Console.WriteLine("具体实现类:intrinsicstate{0},extrinsicstate{1}", intrinsicstate, extrinsicstate); 19 | } 20 | } 21 | 22 | //享元抽象类 23 | public abstract class Flyweight 24 | { 25 | public abstract void Operation(int extrinsicstate); 26 | } 27 | 28 | //享元工厂 29 | public class FlyweightFactory 30 | { 31 | public Dictionary flyweights = new Dictionary(); 32 | 33 | public FlyweightFactory() 34 | { 35 | flyweights.Add("A", new ConcreteFlyweight("A")); 36 | flyweights.Add("B", new ConcreteFlyweight("B")); 37 | flyweights.Add("C", new ConcreteFlyweight("C")); 38 | } 39 | 40 | public Flyweight GetFlyweight(string key) 41 | { 42 | Flyweight flyweight = null; 43 | if (flyweights.ContainsKey(key)) 44 | { 45 | return flyweights[key] as Flyweight; 46 | } 47 | 48 | if (flyweights == null) 49 | { 50 | Console.WriteLine("驻留池中不存在字符串" + key); 51 | flyweight = new ConcreteFlyweight(key); 52 | } 53 | return flyweight as Flyweight; 54 | } 55 | } 56 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/享元模式/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace DesignMethod.享元模式 4 | { 5 | public class Program : OpenDesign 6 | { 7 | public override void Open() 8 | { 9 | //定义外部状态 10 | int externalstate = 10; 11 | //初始化享元工厂 12 | FlyweightFactory factory = new FlyweightFactory(); 13 | //判断是否有A字符 14 | Flyweight fa = factory.GetFlyweight("A"); 15 | if (fa != null) 16 | { 17 | fa.Operation(externalstate); 18 | } 19 | //判断B字符 20 | Flyweight fb = factory.GetFlyweight("B"); 21 | if (fb != null) 22 | { 23 | fb.Operation(externalstate); 24 | } 25 | //判断C字符 26 | Flyweight fc = factory.GetFlyweight("C"); 27 | if (fc != null) 28 | { 29 | fc.Operation(externalstate); 30 | } 31 | //判断D字符 32 | Flyweight fd = factory.GetFlyweight("D"); 33 | if (fd != null) 34 | { 35 | fd.Operation(externalstate); 36 | } 37 | else 38 | { 39 | Console.WriteLine("不存在字符串D"); 40 | ConcreteFlyweight d = new ConcreteFlyweight("D"); 41 | factory.flyweights.Add("D", d); 42 | } 43 | Console.WriteLine(""); 44 | Console.Read(); 45 | } 46 | } 47 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/代理模式/Client.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace DesignMethod.代理模式 4 | { 5 | //代理角色 6 | public class Friend : Person 7 | { 8 | private RealBuyPerson realSubject; 9 | 10 | public override void BuyProduct() 11 | { 12 | Console.WriteLine("通过代理类访问真实实体对象的方法"); 13 | if (realSubject == null) 14 | { 15 | realSubject = new RealBuyPerson(); 16 | } 17 | this.PreBuyProduct(); 18 | realSubject.BuyProduct(); 19 | this.PostBuyProduct(); 20 | } 21 | 22 | //操作2 23 | public void PostBuyProduct() 24 | { 25 | Console.WriteLine("列清单"); 26 | } 27 | 28 | //代理角色执行的一些操作 29 | public void PreBuyProduct() 30 | { 31 | Console.WriteLine("弄清单"); 32 | } 33 | } 34 | 35 | //抽象主题角色 36 | public abstract class Person 37 | { 38 | public abstract void BuyProduct(); 39 | } 40 | 41 | //真实主题角色 42 | public class RealBuyPerson : Person 43 | { 44 | public override void BuyProduct() 45 | { 46 | Console.WriteLine("帮我买一个Iphone和一台苹果电脑"); 47 | } 48 | } 49 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/代理模式/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace DesignMethod.代理模式 4 | { 5 | public class Program : OpenDesign 6 | { 7 | public override void Open() 8 | { 9 | Person proxy = new Friend(); 10 | proxy.BuyProduct(); 11 | Console.Read(); 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/单例模式/Program.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Program 4 | // created by 朱锦润 5 | // created time 2017/07/02 18:07:23 6 | //-------------------------------------------- 7 | 8 | namespace DesignMethod.单例模式 9 | { 10 | public class Program : OpenDesign 11 | { 12 | public override void Open() 13 | { 14 | Singleton let = Singleton.GetInstance(); 15 | let.Co(); 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/单例模式/Singleton.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Singleton 4 | // created by 朱锦润 5 | // created time 2017/07/02 16:58:35 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.单例模式 10 | { 11 | /// 12 | /// 单例模式 13 | /// 14 | public class Singleton 15 | { 16 | //#region 单线程 17 | ////保存类的实例 18 | //private static Singleton uniqueInstance; 19 | ////禁止实例化 20 | //private Singleton() { } 21 | ///// 22 | ///// 提供全局访问点 23 | ///// 24 | ///// 25 | //public static Singleton GetInstance() 26 | //{ 27 | // //不存在就创建,存在就返回 28 | // if (uniqueInstance == null) 29 | // uniqueInstance = new Singleton(); 30 | // return uniqueInstance; 31 | //} 32 | //#endregion 33 | 34 | #region 多线程 双重加锁 35 | 36 | //定义一个标示确保线程同步 37 | private static readonly object locker = new object(); 38 | 39 | //定义静态实例 40 | private static Singleton uniqueInstance; 41 | 42 | //禁止实例 43 | private Singleton() { } 44 | 45 | //定义全局访问点 46 | public static Singleton GetInstance() 47 | { 48 | //第一个线程运行,此时会对locker对象“加锁” 49 | //第二个线程运行,首先检测locker对象为“加锁”状态,该线程就会挂起等待第一个线程解锁 50 | //lock语句运行完后,会对该对象“解锁” 51 | //双重锁定只需要一句话判断就可以了 52 | if (uniqueInstance == null) 53 | { 54 | lock (locker) 55 | { 56 | if (uniqueInstance == null) 57 | { 58 | uniqueInstance = new Singleton(); 59 | } 60 | } 61 | } 62 | return uniqueInstance; 63 | } 64 | 65 | #endregion 多线程 双重加锁 66 | 67 | public void Co() 68 | { 69 | Console.Write("单例模式启动"); 70 | Console.Read(); 71 | } 72 | } 73 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/原型模式/Client.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Client 4 | // created by 朱锦润 5 | // created time 2017/07/03 13:29:29 6 | //-------------------------------------------- 7 | 8 | namespace DesignMethod.原型模式 9 | { 10 | /// 11 | /// 创建具体 12 | /// 13 | public class ConcretePrototype : MonkeyKingPrototype 14 | { 15 | public ConcretePrototype(string id) 16 | : base(id) 17 | { } 18 | 19 | public override MonkeyKingPrototype Clone() 20 | { 21 | return (MonkeyKingPrototype)this.MemberwiseClone(); 22 | } 23 | } 24 | 25 | /// 26 | /// 孙悟空原型 27 | /// 28 | public abstract class MonkeyKingPrototype 29 | { 30 | public MonkeyKingPrototype(string id) 31 | { 32 | this.Id = id; 33 | } 34 | 35 | public string Id { get; set; } 36 | 37 | //克隆方法 38 | public abstract MonkeyKingPrototype Clone(); 39 | } 40 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/原型模式/Program.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Program 4 | // created by 朱锦润 5 | // created time 2017/07/03 13:29:17 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.原型模式 10 | { 11 | public class Program : OpenDesign 12 | { 13 | public override void Open() 14 | { 15 | //原型 16 | MonkeyKingPrototype prototypeKing = new ConcretePrototype("1"); 17 | //变一个 18 | MonkeyKingPrototype cloneMokeyKing = prototypeKing.Clone() as ConcretePrototype; 19 | Console.Write(cloneMokeyKing.Id); 20 | 21 | //变两个 22 | MonkeyKingPrototype cloneMokeyKing2 = prototypeKing.Clone() as ConcretePrototype; 23 | Console.Write(cloneMokeyKing2.Id); 24 | Console.Read(); 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/命令模式/Client.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Client 4 | // created by 朱锦润 5 | // created time 2017/07/06 15:09:07 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.命令模式 10 | { 11 | //命令抽象类 12 | public abstract class Command 13 | { 14 | //命令应该知道接受者是谁,所以有Receiver这个成员变量 15 | protected Receiver _receiver; 16 | 17 | public Command(Receiver receiver) 18 | { 19 | this._receiver = receiver; 20 | } 21 | 22 | public abstract void Action(); 23 | } 24 | 25 | //具体指令 26 | public class ConcreteCommand : Command 27 | { 28 | public ConcreteCommand(Receiver receiver) 29 | : base(receiver) 30 | { } 31 | 32 | public override void Action() 33 | { 34 | _receiver.Run1000Meters(); 35 | } 36 | } 37 | 38 | //调用命令执行要求 39 | public class Invoke 40 | { 41 | public Command _command; 42 | 43 | public Invoke(Command command) 44 | { 45 | this._command = command; 46 | } 47 | 48 | public void ExecuteCommand() 49 | { 50 | _command.Action(); 51 | } 52 | } 53 | 54 | //命令接受者 55 | public class Receiver 56 | { 57 | public void Run1000Meters() 58 | { 59 | Console.WriteLine("跑1000米"); 60 | } 61 | } 62 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/命令模式/Program.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Program 4 | // created by 朱锦润 5 | // created time 2017/07/06 15:08:58 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.命令模式 10 | { 11 | public class Program : OpenDesign 12 | { 13 | public override void Open() 14 | { 15 | Receiver r = new Receiver(); 16 | Command c = new ConcreteCommand(r); 17 | Invoke i = new Invoke(c); 18 | i.ExecuteCommand(); 19 | Console.Read(); 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/备忘录模式/Client.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Client 4 | // created by 朱锦润 5 | // created time 2017/07/08 15:07:31 6 | //-------------------------------------------- 7 | using System; 8 | using System.Collections.Generic; 9 | 10 | namespace DesignMethod.备忘录模式 11 | { 12 | //管理角色 13 | public class Caretaker 14 | { 15 | public ContactMemento ContactM { get; set; } 16 | } 17 | 18 | //备忘录 19 | public class ContactMemento 20 | { 21 | //保存发起人的状态 22 | public List contactPersonBack; 23 | 24 | public ContactMemento(List persons) 25 | { 26 | contactPersonBack = persons; 27 | } 28 | } 29 | 30 | //联系人 31 | public class ContactPerson 32 | { 33 | public string MobileNum { get; set; } 34 | public string Name { get; set; } 35 | } 36 | 37 | //发起人 38 | public class MobileOwner 39 | { 40 | public MobileOwner(List persons) 41 | { 42 | ContactPersons = persons; 43 | } 44 | 45 | //发起人需要保存内部状态 46 | public List ContactPersons { get; set; } 47 | 48 | //创建备忘录 49 | public ContactMemento CreateMemento() 50 | { 51 | return new ContactMemento(new List(this.ContactPersons)); 52 | } 53 | 54 | //将备忘录中的数据备份导入联系人中 55 | public void RestoreMemento(ContactMemento memento) 56 | { 57 | this.ContactPersons = memento.contactPersonBack; 58 | } 59 | 60 | public void Show() 61 | { 62 | Console.WriteLine("联系人列表中有{0}个人", ContactPersons.Count); 63 | foreach (ContactPerson per in ContactPersons) 64 | { 65 | Console.WriteLine("姓名:{0} 号码{1}", per.Name, per.MobileNum); 66 | } 67 | } 68 | } 69 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/备忘录模式/Program.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Program 4 | // created by 朱锦润 5 | // created time 2017/07/08 15:02:26 6 | //-------------------------------------------- 7 | using System; 8 | using System.Collections.Generic; 9 | 10 | namespace DesignMethod.备忘录模式 11 | { 12 | public class Program : OpenDesign 13 | { 14 | public override void Open() 15 | { 16 | List persons = new List() 17 | { 18 | new ContactPerson(){ Name="Learning Hard",MobileNum="123456" }, 19 | new ContactPerson(){ Name="Tony",MobileNum="234567" }, 20 | new ContactPerson(){ Name="Jock",MobileNum="345678" } 21 | }; 22 | MobileOwner mobileOwner = new MobileOwner(persons); 23 | mobileOwner.Show(); 24 | //创建备忘录并保存对象 25 | Caretaker caretaker = new Caretaker(); 26 | caretaker.ContactM = mobileOwner.CreateMemento(); 27 | //更改发起联系人列表 28 | Console.WriteLine("----移除最后一个联系人----"); 29 | mobileOwner.ContactPersons.RemoveAt(2); 30 | mobileOwner.Show(); 31 | //恢复到原始状态 32 | Console.WriteLine("----恢复联系人列表----"); 33 | mobileOwner.RestoreMemento(caretaker.ContactM); 34 | mobileOwner.Show(); 35 | Console.Read(); 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/外观模式/Client.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace DesignMethod.外观模式 4 | { 5 | //子系统B 6 | public class NotifyStudent 7 | { 8 | public bool Notify(string name) 9 | { 10 | Console.WriteLine("正在向{0}发生通知", name); 11 | return true; 12 | } 13 | } 14 | 15 | //子系统A 16 | public class RegisterCourse 17 | { 18 | public bool CheckAvailable(string name) 19 | { 20 | Console.WriteLine("正在验证课程{0}是否人数已满", name); 21 | return true; 22 | } 23 | } 24 | 25 | //外观类 26 | public class RegistrationFacade 27 | { 28 | private NotifyStudent notifyStu; 29 | private RegisterCourse registerCourse; 30 | 31 | public RegistrationFacade() 32 | { 33 | registerCourse = new RegisterCourse(); 34 | notifyStu = new NotifyStudent(); 35 | } 36 | 37 | public bool RegistrationCourse(string name, string stuName) 38 | { 39 | if (!registerCourse.CheckAvailable(name)) 40 | return false; 41 | return notifyStu.Notify(stuName); 42 | } 43 | } 44 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/外观模式/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace DesignMethod.外观模式 4 | { 5 | public class Program : OpenDesign 6 | { 7 | private static RegistrationFacade facade = new RegistrationFacade(); 8 | 9 | public override void Open() 10 | { 11 | if (facade.RegistrationCourse("设计模式", "Lear")) 12 | { 13 | Console.WriteLine("选课成功"); 14 | } 15 | else 16 | Console.WriteLine("选课失败"); 17 | Console.Read(); 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/工厂方法/Food.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Food 4 | // created by 朱锦润 5 | // created time 2017/07/02 17:58:57 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.工厂方法 10 | { 11 | /// 12 | /// 抽象工厂 13 | /// 14 | public abstract class Creator 15 | { 16 | //定义工厂类 17 | public abstract Food CreateFoodFactory(); 18 | } 19 | 20 | /// 21 | /// 食物抽象类 22 | /// 23 | public abstract class Food 24 | { 25 | /// 26 | /// 输出 27 | /// 28 | public abstract void Print(); 29 | } 30 | 31 | /// 32 | /// 土豆 33 | /// 34 | public class ShreddedPorkWithPotatoes : Food 35 | { 36 | public override void Print() 37 | { 38 | Console.WriteLine("土豆"); 39 | } 40 | } 41 | 42 | /// 43 | /// 土豆工厂类 44 | /// 45 | public class ShreddedPorkWithPotatoesFactory : Creator 46 | { 47 | /// 48 | /// 创建土豆 49 | /// 50 | /// 51 | public override Food CreateFoodFactory() 52 | { 53 | return new ShreddedPorkWithPotatoes(); 54 | } 55 | } 56 | 57 | /// 58 | /// 西红柿 59 | /// 60 | public class TomatoScrambledEggs : Food 61 | { 62 | public override void Print() 63 | { 64 | Console.WriteLine("西红柿"); 65 | } 66 | } 67 | 68 | /// 69 | /// 西红柿工厂类 70 | /// 71 | public class TomatoScrambledEggsFactory : Creator 72 | { 73 | /// 74 | /// 创建西红柿 75 | /// 76 | /// 77 | public override Food CreateFoodFactory() 78 | { 79 | return new TomatoScrambledEggs(); 80 | } 81 | } 82 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/工厂方法/Program.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Program 4 | // created by 朱锦润 5 | // created time 2017/07/02 18:09:55 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.工厂方法 10 | { 11 | public class Program : OpenDesign 12 | { 13 | public override void Open() 14 | { 15 | //初始化工厂类 16 | Creator shrFactory = new ShreddedPorkWithPotatoesFactory(); 17 | Creator tomFactory = new TomatoScrambledEggsFactory(); 18 | 19 | //开始西红柿 20 | Food tom = tomFactory.CreateFoodFactory(); 21 | tom.Print(); 22 | 23 | //开始土豆 24 | Food shr = shrFactory.CreateFoodFactory(); 25 | shr.Print(); 26 | 27 | Console.Read(); 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/建造者/Customer.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Customer 4 | // created by 朱锦润 5 | // created time 2017/07/03 10:45:43 6 | //-------------------------------------------- 7 | using System; 8 | using System.Collections.Generic; 9 | 10 | namespace DesignMethod.建造者 11 | { 12 | //抽象建造者 13 | public abstract class Builder 14 | { 15 | //装CPU 16 | public abstract void BuilderPartCPU(); 17 | 18 | //装主板 19 | public abstract void BuilderPartMainBoard(); 20 | 21 | //获得组装好的电脑 22 | public abstract Computer GetComputer(); 23 | } 24 | 25 | //电脑类 26 | public class Computer 27 | { 28 | //电脑组建集合 29 | private IList parts = new List(); 30 | 31 | //单个组件添加到电脑组建集合中 32 | public void Add(string part) 33 | { 34 | parts.Add(part); 35 | } 36 | 37 | //显示 38 | public void Show() 39 | { 40 | Console.WriteLine("开始...."); 41 | foreach (string part in parts) 42 | { 43 | Console.WriteLine("组件" + part + "已装好"); 44 | } 45 | Console.WriteLine("组装完成"); 46 | } 47 | } 48 | 49 | //具体创建者 50 | public class ConcreateBuilder2 : Builder 51 | { 52 | private Computer computer = new Computer(); 53 | 54 | public override void BuilderPartCPU() 55 | { 56 | computer.Add("CPU2"); 57 | } 58 | 59 | public override void BuilderPartMainBoard() 60 | { 61 | computer.Add("Main Board2"); 62 | } 63 | 64 | public override Computer GetComputer() 65 | { 66 | return computer; 67 | } 68 | } 69 | 70 | //具体创建者 71 | public class ConcreteBuilder1 : Builder 72 | { 73 | private Computer computer = new Computer(); 74 | 75 | public override void BuilderPartCPU() 76 | { 77 | computer.Add("CPU1"); 78 | } 79 | 80 | public override void BuilderPartMainBoard() 81 | { 82 | computer.Add("Main Board1"); 83 | } 84 | 85 | public override Computer GetComputer() 86 | { 87 | return computer; 88 | } 89 | } 90 | 91 | public class Director 92 | { 93 | //组装电脑 94 | public void Construct(Builder builder) 95 | { 96 | builder.BuilderPartCPU(); 97 | builder.BuilderPartMainBoard(); 98 | } 99 | } 100 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/建造者/Program.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Program 4 | // created by 朱锦润 5 | // created time 2017/07/03 10:45:15 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.建造者 10 | { 11 | public class Program : OpenDesign 12 | { 13 | public override void Open() 14 | { 15 | //初始化指挥者、构造者 16 | Director director = new Director(); 17 | Builder b1 = new ConcreteBuilder1(); 18 | Builder b2 = new ConcreateBuilder2(); 19 | 20 | //叫员工1去组装第一台电脑 21 | director.Construct(b1); 22 | //组装完,组装人员搬来组装好的电脑 23 | Computer computer1 = b1.GetComputer(); 24 | computer1.Show(); 25 | 26 | //叫员工2去组装第二台电脑 27 | director.Construct(b2); 28 | Computer computer2 = b2.GetComputer(); 29 | computer2.Show(); 30 | 31 | Console.Read(); 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/抽象工厂/Client.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Client 4 | // created by 朱锦润 5 | // created time 2017/07/03 9:46:15 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.抽象工厂 10 | { 11 | // 抽象工厂类 12 | public abstract class AbstractFactory 13 | { 14 | public abstract YaBo CreateYaBo(); 15 | 16 | public abstract YaJia CreateYaJia(); 17 | } 18 | 19 | //南昌工厂类 20 | public class NanChangFactory : AbstractFactory 21 | { 22 | public override YaBo CreateYaBo() 23 | { 24 | return new NanChangYaBo(); 25 | } 26 | 27 | public override YaJia CreateYaJia() 28 | { 29 | return new NanChangYaJia(); 30 | } 31 | } 32 | 33 | //上海工厂 34 | public class ShangHaiFactory : AbstractFactory 35 | { 36 | public override YaBo CreateYaBo() 37 | { 38 | return new ShangHaiYaBo(); 39 | } 40 | 41 | public override YaJia CreateYaJia() 42 | { 43 | return new ShangHaiYaJia(); 44 | } 45 | } 46 | 47 | #region 食品抽象类 48 | 49 | //南昌鸭脖 50 | public class NanChangYaBo : YaBo 51 | { 52 | public override void Print() 53 | { 54 | Console.WriteLine("南昌的鸭脖"); 55 | } 56 | } 57 | 58 | //南昌鸭架 59 | public class NanChangYaJia : YaJia 60 | { 61 | public override void Print() 62 | { 63 | Console.WriteLine("南昌的鸭架"); 64 | } 65 | } 66 | 67 | //上海鸭脖 68 | public class ShangHaiYaBo : YaBo 69 | { 70 | public override void Print() 71 | { 72 | Console.WriteLine("上海鸭脖"); 73 | } 74 | } 75 | 76 | //上海鸭架 77 | public class ShangHaiYaJia : YaJia 78 | { 79 | public override void Print() 80 | { 81 | Console.WriteLine("上海鸭架"); 82 | } 83 | } 84 | 85 | //定义鸭脖抽象类 86 | public abstract class YaBo 87 | { 88 | public abstract void Print(); 89 | } 90 | 91 | //定义鸭架抽象类 92 | public abstract class YaJia 93 | { 94 | public abstract void Print(); 95 | } 96 | 97 | #endregion 食品抽象类 98 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/抽象工厂/Program.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Program 4 | // created by 朱锦润 5 | // created time 2017/07/03 9:43:11 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.抽象工厂 10 | { 11 | public class Program : OpenDesign 12 | { 13 | public override void Open() 14 | { 15 | AbstractFactory nanChangFac = new NanChangFactory(); 16 | YaBo nanChangYaBo = nanChangFac.CreateYaBo(); 17 | nanChangYaBo.Print(); 18 | 19 | AbstractFactory shangHaiFac = new ShangHaiFactory(); 20 | shangHaiFac.CreateYaJia().Print(); 21 | shangHaiFac.CreateYaBo().Print(); 22 | 23 | Console.Read(); 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/桥接模式/Cilent.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Cilent 4 | // created by 朱锦润 5 | // created time 2017/07/03 15:39:56 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.桥接模式 10 | { 11 | public class ChangHong : TV 12 | { 13 | public override void Off() 14 | { 15 | Console.WriteLine("长虹关闭"); 16 | } 17 | 18 | public override void On() 19 | { 20 | Console.WriteLine("长虹打开"); 21 | } 22 | 23 | public override void tuneChannel() 24 | { 25 | Console.WriteLine("长虹换频道"); 26 | } 27 | } 28 | 29 | public class ConcreteRemote : RemoteControl 30 | { 31 | public override void SetChannel() 32 | { 33 | Console.WriteLine("-----------------------"); 34 | base.SetChannel(); 35 | Console.WriteLine("-----------------------"); 36 | } 37 | } 38 | 39 | /// 40 | /// 抽象概念中的遥控器,抽象化角色 41 | /// 42 | public class RemoteControl 43 | { 44 | private TV implementor; 45 | 46 | public TV Implementor 47 | { 48 | get { return implementor; } 49 | set { implementor = value; } 50 | } 51 | 52 | public virtual void Off() 53 | { 54 | implementor.Off(); 55 | } 56 | 57 | public virtual void On() 58 | { 59 | implementor.On(); 60 | } 61 | 62 | public virtual void SetChannel() 63 | { 64 | implementor.tuneChannel(); 65 | } 66 | } 67 | 68 | public class SanXing : TV 69 | { 70 | public override void Off() 71 | { 72 | Console.WriteLine("三星关闭"); 73 | } 74 | 75 | public override void On() 76 | { 77 | Console.WriteLine("三星打开"); 78 | } 79 | 80 | public override void tuneChannel() 81 | { 82 | Console.WriteLine("三星换频道"); 83 | } 84 | } 85 | 86 | public abstract class TV 87 | { 88 | public abstract void Off(); 89 | 90 | public abstract void On(); 91 | 92 | public abstract void tuneChannel(); 93 | } 94 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/桥接模式/Program.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Program 4 | // created by 朱锦润 5 | // created time 2017/07/03 15:39:48 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.桥接模式 10 | { 11 | public class Program : OpenDesign 12 | { 13 | public override void Open() 14 | { 15 | RemoteControl remote = new ConcreteRemote(); 16 | remote.Implementor = new ChangHong(); 17 | remote.On(); 18 | remote.Off(); 19 | remote.SetChannel(); 20 | Console.WriteLine(); 21 | 22 | remote.Implementor = new SanXing(); 23 | remote.On(); 24 | remote.Off(); 25 | remote.SetChannel(); 26 | Console.WriteLine(); 27 | 28 | Console.Read(); 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/模板模式/Client.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Client 4 | // created by 朱锦润 5 | // created time 2017/07/06 10:44:39 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.模板模式 10 | { 11 | //大白菜 12 | public class ChineseCabbage : Vegetabel 13 | { 14 | public override void pourVegetabel() 15 | { 16 | Console.WriteLine("倒大白菜进锅中"); 17 | } 18 | } 19 | 20 | //菠菜 21 | public class Spinach : Vegetabel 22 | { 23 | public override void pourVegetabel() 24 | { 25 | Console.WriteLine("倒菠菜进锅中"); 26 | } 27 | } 28 | 29 | //定义抽象类 30 | public abstract class Vegetabel 31 | { 32 | //模板方法,不要定义可重写的修饰符 33 | public void CookVegetabel() 34 | { 35 | Console.WriteLine("炒蔬菜的一般做法"); 36 | this.pourOil(); 37 | this.HeatOil(); 38 | this.pourVegetabel(); 39 | this.stir_fly(); 40 | } 41 | 42 | //油烧热 43 | public void HeatOil() 44 | { 45 | Console.WriteLine("油烧热"); 46 | } 47 | 48 | //倒油 49 | public void pourOil() 50 | { 51 | Console.WriteLine("倒油"); 52 | } 53 | 54 | //油热了之后倒蔬菜下去,具体哪种蔬菜由子类决定 55 | public abstract void pourVegetabel(); 56 | 57 | //开始翻炒蔬菜 58 | public void stir_fly() 59 | { 60 | Console.WriteLine("翻炒"); 61 | } 62 | } 63 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/模板模式/Program.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Program 4 | // created by 朱锦润 5 | // created time 2017/07/06 10:44:32 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.模板模式 10 | { 11 | public class Program : OpenDesign 12 | { 13 | public override void Open() 14 | { 15 | Spinach spinach = new Spinach(); 16 | spinach.CookVegetabel(); 17 | Console.Read(); 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/状态模式/Client.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Client 4 | // created by 朱锦润 5 | // created time 2017/07/07 13:47:03 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.状态模式 10 | { 11 | /// 12 | /// 当前对象的状态 13 | /// 14 | public class Account 15 | { 16 | public Account(string owner) 17 | { 18 | this.Owner = owner; 19 | this.State = new SilverState(0.00, this); 20 | } 21 | 22 | public double Balance { get { return State.Balance; } } 23 | public string Owner { get; set; } 24 | public State State { get; set; } 25 | 26 | //存款 27 | public void Deposit(double amount) 28 | { 29 | State.Deposit(amount); 30 | Console.WriteLine("存款金额为:{0:C}---", amount); 31 | Console.WriteLine("账户余额为 =:{0:C}", this.Balance); 32 | Console.WriteLine("账户状态为: {0}", this.State.GetType().Name); 33 | Console.WriteLine(); 34 | } 35 | 36 | //余额 37 | public void PayInterest() 38 | { 39 | State.PayInterest(); 40 | Console.WriteLine("Interest Paid --- "); 41 | Console.WriteLine("账户余额为 =:{0:C}", this.Balance); 42 | Console.WriteLine("账户状态为: {0}", this.State.GetType().Name); 43 | Console.WriteLine(); 44 | } 45 | 46 | //取款 47 | public void Withdraw(double amount) 48 | { 49 | State.Withdraw(amount); 50 | Console.WriteLine("取款金额为:{0:C}---", amount); 51 | Console.WriteLine("账户余额为 =:{0:C}", this.Balance); 52 | Console.WriteLine("账户状态为: {0}", this.State.GetType().Name); 53 | Console.WriteLine(); 54 | } 55 | } 56 | 57 | //普通账户 58 | public class GoldState : State 59 | { 60 | public GoldState(State state) 61 | { 62 | this.Balance = state.Balance; 63 | this.Account = state.Account; 64 | Interest = 0.05; 65 | LowerLimit = 1000.00; 66 | UpperLimit = 10000.00; 67 | } 68 | 69 | public override void Deposit(double amount) 70 | { 71 | Balance += amount; 72 | StateChangeCheck(); 73 | } 74 | 75 | public override void PayInterest() 76 | { 77 | Balance += Interest * Balance; 78 | StateChangeCheck(); 79 | } 80 | 81 | public override void Withdraw(double amount) 82 | { 83 | Balance -= amount; 84 | StateChangeCheck(); 85 | } 86 | 87 | private void StateChangeCheck() 88 | { 89 | if (Balance < 0.0) 90 | { 91 | Account.State = new RedState(this); 92 | } 93 | else if (Balance < LowerLimit) 94 | { 95 | Account.State = new SilverState(this); 96 | } 97 | } 98 | } 99 | 100 | //透支 101 | public class RedState : State 102 | { 103 | public RedState(State state) 104 | { 105 | this.Balance = state.Balance; 106 | this.Account = state.Account; 107 | Interest = 0.0; 108 | LowerLimit = -100.0; 109 | UpperLimit = 0.00; 110 | } 111 | 112 | //存款 113 | public override void Deposit(double amount) 114 | { 115 | Balance += amount; 116 | StateChangeCheck(); 117 | } 118 | 119 | public override void PayInterest() 120 | { 121 | } 122 | 123 | //取钱 124 | public override void Withdraw(double amount) 125 | { 126 | Console.WriteLine("没有钱可以取"); 127 | } 128 | 129 | private void StateChangeCheck() 130 | { 131 | if (Balance > UpperLimit) 132 | { 133 | Account.State = new SilverState(this); 134 | } 135 | } 136 | } 137 | 138 | //新建账户 139 | public class SilverState : State 140 | { 141 | public SilverState(State state) 142 | : this(state.Balance, state.Account) 143 | { 144 | } 145 | 146 | public SilverState(double balance, Account account) 147 | { 148 | this.Balance = balance; 149 | this.Account = account; 150 | Interest = 0.00; 151 | LowerLimit = 0.00; 152 | UpperLimit = 1000.00; 153 | } 154 | 155 | public override void Deposit(double amount) 156 | { 157 | Balance += amount; 158 | StateChangeCheck(); 159 | } 160 | 161 | public override void PayInterest() 162 | { 163 | Balance += Interest * Balance; 164 | StateChangeCheck(); 165 | } 166 | 167 | public override void Withdraw(double amount) 168 | { 169 | Balance -= amount; 170 | StateChangeCheck(); 171 | } 172 | 173 | private void StateChangeCheck() 174 | { 175 | if (Balance < LowerLimit) 176 | { 177 | Account.State = new RedState(this); 178 | } 179 | else if (Balance > UpperLimit) 180 | { 181 | Account.State = new GoldState(this); 182 | } 183 | } 184 | } 185 | 186 | /// 187 | /// 抽象状态类 188 | /// 189 | public abstract class State 190 | { 191 | //状态 192 | public Account Account { get; set; } 193 | 194 | //余额 195 | public double Balance { get; set; } 196 | 197 | //利率 198 | public double Interest { get; set; } 199 | 200 | //上限 201 | public double LowerLimit { get; set; } 202 | 203 | //下限 204 | public double UpperLimit { get; set; } 205 | 206 | //存款 207 | public abstract void Deposit(double amount); 208 | 209 | //获得利息 210 | public abstract void PayInterest(); 211 | 212 | //取钱 213 | public abstract void Withdraw(double amount); 214 | } 215 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/状态模式/Program.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Program 4 | // created by 朱锦润 5 | // created time 2017/07/07 13:44:11 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.状态模式 10 | { 11 | public class Program : OpenDesign 12 | { 13 | public override void Open() 14 | { 15 | Account account = new Account("Lear"); 16 | account.Deposit(1000.00); 17 | account.Deposit(600.00); 18 | account.Deposit(200.00); 19 | 20 | //利息 21 | account.PayInterest(); 22 | 23 | //取钱 24 | account.Withdraw(2000.00); 25 | account.Withdraw(500.00); 26 | 27 | //等待输入 28 | Console.Read(); 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/策略者模式/Client.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Client 4 | // created by 朱锦润 5 | // created time 2017/07/08 11:14:52 6 | //-------------------------------------------- 7 | 8 | namespace DesignMethod.策略者模式 9 | { 10 | //所得税计算策略 11 | public interface ITaxStragety 12 | { 13 | double CalculateTax(double income); 14 | } 15 | 16 | //企业所得税 17 | public class EnterpriseTaxStrategy : ITaxStragety 18 | { 19 | public double CalculateTax(double income) 20 | { 21 | return (income - 3500) > 0 ? (income - 3500) * 0.045 : 0.0; 22 | } 23 | } 24 | 25 | public class InterestOperation 26 | { 27 | private ITaxStragety m_strategy; 28 | 29 | public InterestOperation(ITaxStragety strategy) 30 | { 31 | this.m_strategy = strategy; 32 | } 33 | 34 | public double GetTax(double income) 35 | { 36 | return m_strategy.CalculateTax(income); 37 | } 38 | } 39 | 40 | //个人所得税 41 | public class PersonalTaxStrategy : ITaxStragety 42 | { 43 | public double CalculateTax(double income) 44 | { 45 | return income * 0.12; 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/策略者模式/Program.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Program 4 | // created by 朱锦润 5 | // created time 2017/07/08 11:12:34 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.策略者模式 10 | { 11 | public class Program : OpenDesign 12 | { 13 | public override void Open() 14 | { 15 | //个人所得税 16 | InterestOperation operation = new InterestOperation(new PersonalTaxStrategy()); 17 | Console.WriteLine("个人支付税为:{0}", operation.GetTax(5000.00)); 18 | Console.WriteLine("-----------------------------"); 19 | operation = new InterestOperation(new EnterpriseTaxStrategy()); 20 | Console.WriteLine("企业支付税为:{0}", operation.GetTax(5000.00)); 21 | Console.Read(); 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/简单工厂/Client.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Client 4 | // created by 朱锦润 5 | // created time 2017/07/08 16:04:29 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.简单工厂 10 | { 11 | /// 12 | /// 菜抽象类 13 | /// 14 | public abstract class Food 15 | { 16 | // 输出点了什么菜 17 | public abstract void Print(); 18 | } 19 | 20 | /// 21 | /// 简单工厂类, 负责 炒菜 22 | /// 23 | public class FoodSimpleFactory 24 | { 25 | public static Food CreateFood(string type) 26 | { 27 | Food food = null; 28 | if (type.Equals("土豆肉丝")) 29 | { 30 | food = new ShreddedPorkWithPotatoes(); 31 | } 32 | else if (type.Equals("西红柿炒蛋")) 33 | { 34 | food = new TomatoScrambledEggs(); 35 | } 36 | 37 | return food; 38 | } 39 | } 40 | 41 | /// 42 | /// 土豆肉丝这道菜 43 | /// 44 | public class ShreddedPorkWithPotatoes : Food 45 | { 46 | public override void Print() 47 | { 48 | Console.WriteLine("一份土豆肉丝"); 49 | } 50 | } 51 | 52 | /// 53 | /// 西红柿炒鸡蛋这道菜 54 | /// 55 | public class TomatoScrambledEggs : Food 56 | { 57 | public override void Print() 58 | { 59 | Console.WriteLine("一份西红柿炒蛋!"); 60 | } 61 | } 62 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/简单工厂/Program.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Program 4 | // created by 朱锦润 5 | // created time 2017/07/08 16:04:24 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.简单工厂 10 | { 11 | public class Program : OpenDesign 12 | { 13 | public override void Open() 14 | { 15 | // 客户想点一个西红柿炒蛋 16 | Food food1 = FoodSimpleFactory.CreateFood("西红柿炒蛋"); 17 | food1.Print(); 18 | 19 | // 客户想点一个土豆肉丝 20 | Food food2 = FoodSimpleFactory.CreateFood("土豆肉丝"); 21 | food2.Print(); 22 | 23 | Console.Read(); 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/组合模式/Client.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Client 4 | // created by 朱锦润 5 | // created time 2017/07/03 17:16:27 6 | //-------------------------------------------- 7 | using System; 8 | using System.Collections.Generic; 9 | 10 | namespace DesignMethod.组合模式 11 | { 12 | /// 13 | /// 圆 14 | /// 15 | public class Circle : Graphics 16 | { 17 | public Circle(string name) 18 | : base(name) 19 | { } 20 | 21 | public override void Add(Graphics g) 22 | { 23 | throw new Exception("不能向圆添加其他图形"); 24 | } 25 | 26 | public override void Draw() 27 | { 28 | Console.WriteLine("画:" + Name); 29 | } 30 | 31 | public override void Remove(Graphics g) 32 | { 33 | throw new Exception("不能向圆添加其他图形"); 34 | } 35 | } 36 | 37 | /// 38 | /// 复杂图形 39 | /// 40 | public class ComplexGraphics : Graphics 41 | { 42 | private List complexGraphicsList = new List(); 43 | 44 | public ComplexGraphics(string name) 45 | : base(name) 46 | { } 47 | 48 | public override void Add(Graphics g) 49 | { 50 | complexGraphicsList.Add(g); 51 | } 52 | 53 | public override void Draw() 54 | { 55 | foreach (Graphics g in complexGraphicsList) 56 | { 57 | g.Draw(); 58 | } 59 | } 60 | 61 | public override void Remove(Graphics g) 62 | { 63 | complexGraphicsList.Remove(g); 64 | } 65 | } 66 | 67 | /// 68 | /// 抽象类 69 | /// 70 | public abstract class Graphics 71 | { 72 | public Graphics(string name) 73 | { 74 | this.Name = name; 75 | } 76 | 77 | public string Name { get; set; } 78 | 79 | public abstract void Add(Graphics g); 80 | 81 | public abstract void Draw(); 82 | 83 | public abstract void Remove(Graphics g); 84 | } 85 | 86 | /// 87 | /// 线 88 | /// 89 | public class Line : Graphics 90 | { 91 | public Line(string name) 92 | : base(name) 93 | { } 94 | 95 | public override void Add(Graphics g) 96 | { 97 | throw new Exception("不能向线添加其他图形"); 98 | } 99 | 100 | public override void Draw() 101 | { 102 | Console.WriteLine("画:" + Name); 103 | } 104 | 105 | public override void Remove(Graphics g) 106 | { 107 | throw new Exception("不能向线添加其他图形"); 108 | } 109 | } 110 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/组合模式/Client2.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Client2 4 | // created by 朱锦润 5 | // created time 2017/07/03 18:01:00 6 | //-------------------------------------------- 7 | using System; 8 | using System.Collections.Generic; 9 | 10 | namespace DesignMethod.组合模式 11 | { 12 | //圆 13 | public class Circle2 : Graphics2 14 | { 15 | public Circle2(string name) 16 | : base(name) 17 | { } 18 | 19 | public override void Draw() 20 | { 21 | Console.WriteLine("画:" + Name2); 22 | } 23 | } 24 | 25 | //复杂图形 26 | public class ComplexGraphics2 : Graphics2 27 | { 28 | private List complexGraphicsList = new List(); 29 | 30 | public ComplexGraphics2(string name) 31 | : base(name) 32 | { } 33 | 34 | public void Add(Graphics2 g) 35 | { 36 | complexGraphicsList.Add(g); 37 | } 38 | 39 | public override void Draw() 40 | { 41 | foreach (Graphics2 g in complexGraphicsList) 42 | { 43 | g.Draw(); 44 | } 45 | } 46 | 47 | public void Remote(Graphics2 g) 48 | { 49 | complexGraphicsList.Remove(g); 50 | } 51 | } 52 | 53 | //图形抽象类 54 | public abstract class Graphics2 55 | { 56 | public Graphics2(string name) 57 | { 58 | this.Name2 = name; 59 | } 60 | 61 | public string Name2 { get; set; } 62 | 63 | public abstract void Draw(); 64 | } 65 | 66 | //线 67 | public class Line2 : Graphics2 68 | { 69 | public Line2(string name) 70 | : base(name) 71 | { } 72 | 73 | public override void Draw() 74 | { 75 | Console.WriteLine("画:" + Name2); 76 | } 77 | } 78 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/组合模式/Program.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Program 4 | // created by 朱锦润 5 | // created time 2017/07/03 17:16:17 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.组合模式 10 | { 11 | public class Program : OpenDesign 12 | { 13 | public static void Open1() 14 | { 15 | #region 安全式组合模式 16 | 17 | ComplexGraphics2 complexGraphics = new ComplexGraphics2("复杂图形"); 18 | complexGraphics.Add(new Line2("线A")); 19 | ComplexGraphics2 CompositeCG = new ComplexGraphics2("一个园和一条线"); 20 | CompositeCG.Add(new Circle2("圆")); 21 | CompositeCG.Add(new Line2("线段B")); 22 | complexGraphics.Add(CompositeCG); 23 | Line2 l = new Line2("线段C"); 24 | complexGraphics.Add(l); 25 | //显示复杂图形画法 26 | Console.WriteLine("复杂图形的绘制如下:"); 27 | complexGraphics.Draw(); 28 | Console.WriteLine("复杂图形绘制完成"); 29 | Console.WriteLine(""); 30 | //移除一个组件再显示复杂图形的画法 31 | complexGraphics.Remote(l); 32 | Console.WriteLine("移除线段C后,复杂图形的绘制如下:"); 33 | complexGraphics.Draw(); 34 | Console.WriteLine("复杂图形绘制完成"); 35 | Console.Read(); 36 | 37 | #endregion 安全式组合模式 38 | } 39 | 40 | public override void Open() 41 | { 42 | #region 透明式组合模式 43 | 44 | ComplexGraphics complexGraphics = new ComplexGraphics("一个复杂图形和两条线段组成的复杂图形"); 45 | complexGraphics.Add(new Line("线段A")); 46 | ComplexGraphics CompositeCG = new ComplexGraphics("一个圆和一条线组成的复杂图形"); 47 | CompositeCG.Add(new Circle("圆")); 48 | CompositeCG.Add(new Circle("线段B")); 49 | complexGraphics.Add(CompositeCG); 50 | Line l = new Line("线段C"); 51 | complexGraphics.Add(l); 52 | //显示复杂图形的画法 53 | Console.WriteLine("复杂图形的绘制如下:"); 54 | complexGraphics.Draw(); 55 | Console.WriteLine("复杂图形绘制完成"); 56 | Console.WriteLine(""); 57 | //移除一个组件再显示复杂图形的画法 58 | complexGraphics.Remove(l); 59 | Console.WriteLine("移除线段C后,复杂图形的绘制如下:"); 60 | complexGraphics.Draw(); 61 | Console.WriteLine("复杂图形绘制完成"); 62 | Console.Read(); 63 | 64 | #endregion 透明式组合模式 65 | 66 | #region 安全组合模式 67 | 68 | Open1(); 69 | 70 | #endregion 安全组合模式 71 | } 72 | } 73 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/装饰者模式/Client.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Client 4 | // created by 朱锦润 5 | // created time 2017/07/03 16:27:05 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.装饰者模式 10 | { 11 | //挂件 12 | public class Accessories : Decorator 13 | { 14 | public Accessories(Phone p) 15 | : base(p) 16 | { } 17 | 18 | public void AddAccessories() 19 | { 20 | Console.WriteLine("有挂件"); 21 | } 22 | 23 | public override void Print() 24 | { 25 | base.Print(); 26 | AddAccessories(); 27 | } 28 | } 29 | 30 | //苹果手机 31 | public class ApplePhone : Phone 32 | { 33 | public override void Print() 34 | { 35 | Console.WriteLine("开始执行具体的对象---苹果手机"); 36 | } 37 | } 38 | 39 | //装饰抽象类 40 | public abstract class Decorator : Phone 41 | { 42 | private Phone phone; 43 | 44 | public Decorator(Phone p) 45 | { 46 | this.phone = p; 47 | } 48 | 49 | public override void Print() 50 | { 51 | if (phone != null) 52 | { 53 | phone.Print(); 54 | } 55 | } 56 | } 57 | 58 | //手机抽象类 59 | public abstract class Phone 60 | { 61 | public abstract void Print(); 62 | } 63 | 64 | //贴膜 65 | public class Sticker : Decorator 66 | { 67 | public Sticker(Phone p) 68 | : base(p) 69 | { } 70 | 71 | public void AddSticker() 72 | { 73 | Console.WriteLine("有贴膜"); 74 | } 75 | 76 | public override void Print() 77 | { 78 | base.Print(); 79 | AddSticker(); 80 | } 81 | } 82 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/装饰者模式/Program.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Program 4 | // created by 朱锦润 5 | // created time 2017/07/03 16:26:36 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.装饰者模式 10 | { 11 | public class Program : OpenDesign 12 | { 13 | public override void Open() 14 | { 15 | Phone phone = new ApplePhone(); 16 | //贴膜 17 | Decorator appleSticker = new Sticker(phone); 18 | //拓展 19 | appleSticker.Print(); 20 | Console.WriteLine("-----------\n"); 21 | //挂件 22 | Decorator appleAccess = new Accessories(phone); 23 | //拓展 24 | appleAccess.Print(); 25 | Console.WriteLine("-----------\n"); 26 | //同时有俩 27 | Sticker sti = new Sticker(phone); 28 | Accessories appleAccess2 = new Accessories(sti); 29 | appleAccess2.Print(); 30 | Console.Read(); 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/观察者模式/Client.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Client 4 | // created by 朱锦润 5 | // created time 2017/07/08 9:55:07 6 | //-------------------------------------------- 7 | using System; 8 | using System.Collections.Generic; 9 | 10 | namespace DesignMethod.观察者模式 11 | { 12 | //委托-------------------------------------------------------------------------------------------------------------------------------------------------- 13 | public delegate void NotifyEventHandler(object sender); 14 | 15 | //订阅者接口 16 | public interface IObserver 17 | { 18 | void ReceiveAndPrint(TenXun tenxun); 19 | } 20 | 21 | //具体订阅类 22 | public class Subscriber : IObserver 23 | { 24 | public Subscriber(string name) 25 | { 26 | this.Name = name; 27 | } 28 | 29 | public string Name { get; set; } 30 | 31 | public void ReceiveAndPrint(TenXun tenxun) 32 | { 33 | Console.WriteLine("Notified {0} of {1} 's" + " Info is: {2}", Name, tenxun.Symbol, tenxun.Info); 34 | } 35 | } 36 | 37 | //委托 38 | public class SubscriberWt 39 | { 40 | public SubscriberWt(string name) 41 | { 42 | this.Name = name; 43 | } 44 | 45 | public string Name { get; set; } 46 | 47 | public void ReceiveAndPrint(Object ob) 48 | { 49 | TenXunWt tenxun = ob as TenXunWt; 50 | if (tenxun != null) 51 | Console.WriteLine("Notified {0} of {1}'s" + " Info is: {2}", Name, tenxun.Symbol, tenxun.Info); 52 | } 53 | } 54 | 55 | //订阅号抽象类 56 | public abstract class TenXun 57 | { 58 | //保留订阅号列表 59 | private List observers = new List(); 60 | 61 | public TenXun(string symbol, string info) 62 | { 63 | this.Symbol = symbol; 64 | this.Info = info; 65 | } 66 | 67 | public string Info { get; set; } 68 | public string Symbol { get; set; } 69 | 70 | #region 新增对订阅号列表的维护操作 71 | 72 | public void AddObserver(IObserver ob) 73 | { 74 | observers.Add(ob); 75 | } 76 | 77 | public void RemoveObserver(IObserver ob) 78 | { 79 | observers.Remove(ob); 80 | } 81 | 82 | #endregion 新增对订阅号列表的维护操作 83 | 84 | public void Update() 85 | { 86 | //遍历订阅者列表进行通知 87 | foreach (IObserver ob in observers) 88 | { 89 | if (ob != null) 90 | ob.ReceiveAndPrint(this); 91 | } 92 | } 93 | } 94 | 95 | //具体订阅号 96 | public class TenXunGame : TenXun 97 | { 98 | public TenXunGame(string symbol, string info) 99 | : base(symbol, info) 100 | { } 101 | } 102 | 103 | //委托 104 | public class TenXunGameWt : TenXunWt 105 | { 106 | public TenXunGameWt(string symbol, string info) 107 | : base(symbol, info) { } 108 | } 109 | 110 | //委托 111 | public class TenXunWt 112 | { 113 | //保留订阅号列表 114 | public NotifyEventHandler NotifyEvent; 115 | 116 | public TenXunWt(string symbol, string info) 117 | { 118 | this.Symbol = symbol; 119 | this.Info = info; 120 | } 121 | 122 | public string Info { get; set; } 123 | public string Symbol { get; set; } 124 | 125 | #region 新增对订阅号列表的维护操作 126 | 127 | public void AddObserver(NotifyEventHandler ob) 128 | { 129 | NotifyEvent += ob; 130 | } 131 | 132 | public void RemoveObserver(NotifyEventHandler ob) 133 | { 134 | NotifyEvent -= ob; 135 | } 136 | 137 | #endregion 新增对订阅号列表的维护操作 138 | 139 | public void Update() 140 | { 141 | if (NotifyEvent != null) 142 | NotifyEvent(this); 143 | } 144 | } 145 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/观察者模式/Program.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Program 4 | // created by 朱锦润 5 | // created time 2017/07/08 9:54:37 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.观察者模式 10 | { 11 | public class Program : OpenDesign 12 | { 13 | public override void Open() 14 | { 15 | #region 观察者模式 16 | 17 | //TenXun tenXun = new TenXunGame("TenXun Game", "Have a new game published ...."); 18 | ////添加订阅者 19 | //tenXun.AddObserver(new Subscriber("Learning Hard")); 20 | //tenXun.AddObserver(new Subscriber("Tom")); 21 | //tenXun.Update(); 22 | //Console.WriteLine("-----------------------------------"); 23 | //Console.WriteLine("移除Tom订阅者"); 24 | //tenXun.RemoveObserver(new Subscriber("Tom")); 25 | //tenXun.Update(); 26 | 27 | #endregion 观察者模式 28 | 29 | #region 观察者模式使用委托 30 | 31 | TenXunWt tenXun = new TenXunGameWt("TenXun Game", "Have a new game published ...."); 32 | //添加订阅者 33 | SubscriberWt lh = new SubscriberWt("Learning Hard"); 34 | SubscriberWt tom = new SubscriberWt("Tom"); 35 | tenXun.AddObserver(new 观察者模式.NotifyEventHandler(lh.ReceiveAndPrint)); 36 | tenXun.AddObserver(new 观察者模式.NotifyEventHandler(tom.ReceiveAndPrint)); 37 | tenXun.Update(); 38 | Console.WriteLine("-----------------------------------"); 39 | Console.WriteLine("移除Tom订阅者"); 40 | tenXun.RemoveObserver(new 观察者模式.NotifyEventHandler(tom.ReceiveAndPrint)); 41 | tenXun.Update(); 42 | 43 | #endregion 观察者模式使用委托 44 | 45 | Console.ReadLine(); 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/解释者模式/Client.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Client 4 | // created by 朱锦润 5 | // created time 2017/07/08 15:39:17 6 | //-------------------------------------------- 7 | using System; 8 | using System.Collections.Generic; 9 | using System.Text; 10 | 11 | namespace DesignMethod.解释者模式 12 | { 13 | //接口 14 | public interface IExpression 15 | { 16 | void Interpret(StringBuilder sb); 17 | } 18 | 19 | //中英文对照字典 20 | public static class ChineseEnglishDict 21 | { 22 | private static Dictionary _dictory = new Dictionary(); 23 | 24 | static ChineseEnglishDict() 25 | { 26 | _dictory.Add("this", "这"); 27 | _dictory.Add("is", "是"); 28 | _dictory.Add("an", "一个"); 29 | _dictory.Add("apple", "苹果"); 30 | } 31 | 32 | public static string GetEnglish(string value) 33 | { 34 | return _dictory[value]; 35 | } 36 | } 37 | 38 | //包装 39 | public static class Translator 40 | { 41 | public static string Translate(string sentense) 42 | { 43 | StringBuilder sb = new StringBuilder(); 44 | List expressions = new List(); 45 | string[] elements = sentense.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries); 46 | foreach (string element in elements) 47 | { 48 | string[] words = element.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 49 | foreach (string word in words) 50 | { 51 | expressions.Add(new WordExpression(word)); 52 | } 53 | expressions.Add(new SymbolExpression(".")); 54 | } 55 | foreach (IExpression expression in expressions) 56 | { 57 | expression.Interpret(sb); 58 | } 59 | return sb.ToString(); 60 | } 61 | } 62 | 63 | public class SymbolExpression : IExpression 64 | { 65 | private string _value; 66 | 67 | public SymbolExpression(string value) 68 | { 69 | _value = value; 70 | } 71 | 72 | public void Interpret(StringBuilder sb) 73 | { 74 | switch (_value) 75 | { 76 | case ".": 77 | sb.Append("。"); 78 | break; 79 | 80 | default: 81 | break; 82 | } 83 | } 84 | } 85 | 86 | //具体翻译类 87 | public class WordExpression : IExpression 88 | { 89 | private string _value; 90 | 91 | public WordExpression(string value) 92 | { 93 | _value = value; 94 | } 95 | 96 | public void Interpret(StringBuilder sb) 97 | { 98 | sb.Append(ChineseEnglishDict.GetEnglish(_value.ToLower())); 99 | } 100 | } 101 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/解释者模式/Program.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Program 4 | // created by 朱锦润 5 | // created time 2017/07/08 15:38:57 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.解释者模式 10 | { 11 | public class Program : OpenDesign 12 | { 13 | public override void Open() 14 | { 15 | string englist = "This is an apple."; 16 | string chinese = Translator.Translate(englist); 17 | Console.WriteLine(chinese); 18 | Console.Read(); 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/设计摘要/创建性模式.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 创建性模式 6 | 7 | 8 |
9 | 返回顶部 10 |
11 |

设计原则  创建型模式  下一个

12 |
 13 |   创建型模式就是用来创建对象的模式,抽象了实例化的过程。所有的创建型模式都有两个共同点。
 14 |   第一,它们都将系统使用哪些具体类的信息封装起来;
 15 |   第二,它们隐藏了这些类的实例是如何被创建和组织的。
 16 |   创建型模式包括 单例模式简单工厂工厂方法模式抽象工厂模式建造者模式
 17 |   和原型模式
 18 | 
19 |
20 |
    21 |
  • 单例模式:解决的是实例化对象的个数问题,比如抽象工厂中的工厂、对象池等,除了Singleton之外,其他创建型模式解决的都是new所带来的耦合关系
  • 22 |
  • 抽象工厂:创建一系列相互依赖对象,并在运行时改变系列
  • 23 |
  • 工厂方法:创建单个对象,并在运行时改变
  • 24 |
  • 原型模式:通过拷贝原型来创建新的对象
  • 25 |
  • 建造者:创建操作对象,并根据操作对象进行生成
  • 26 |
27 |
28 |
29 |

单例模式

30 |
 31 |   介绍:
 32 |     确保一个类只有一个实例,并提供一个全局访问点。
 33 |   产生原因:
 34 |     操作系统中只能有一个任务管理器,操作文件时,同一时间内只允许一个实例对其操作等,既然现实生活中有这样的应用场景,
 35 |     自然在软件设计领域必须有这样的解决方案了(因为软件设计也是现实生活中的抽象),所以也就有了单例模式了。
 36 |   常用场景:应用中有对象需要是全局的且唯一。
 37 |   选择关键点:一个对象在应用中出现多个实例是否会引起逻辑上或者是程序上的错误。
 38 |   逆鳞:在以为是单例的情况下,却产生了多个实例。
 39 | 
40 |
41 |
42 |

简单工厂

43 |
 44 |   介绍:
 45 |     降低对象之间的耦合度。
 46 |   备注:
 47 |     继承抽象类,由工厂类判断传递参数,来决定实例化那些类。
 48 |   常用场景:需要在一堆产品中选择其中一个产品。
 49 |   选择关键点:一种产品是否可根据某个参数决定它的种类。
 50 |   逆鳞:工厂类不能正常工作。
 51 | 
52 |
53 |
54 |

工厂方法

55 |
 56 |   介绍:
 57 |     工厂模式把实现具体产品创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口。
 58 |     这样工厂方法模式就可以允许系统不修改工厂类逻辑的情况下来添加新产品。
 59 |   备注:
 60 |     抽象工厂类,定义抽象方法。子类继承抽象工厂,实现该方法。调用的时候,使用抽象类实例继承的子类,再去调用子类的方法。
 61 |   常用场景:(1)希望工厂与产品的种类对客户端保持透明,给客户端提供一致的操作。(2)不同的工厂和产品可以提供客户端不同的服务或功能。
 62 |   选择关键点:工厂类和产品类是否是同生同灭的关系
 63 |   逆鳞:-
 64 | 
65 |
66 |
67 |

抽象工厂

68 |
 69 |   介绍:
 70 |     提供一个创建产品的接口来负责创建相关或依赖的对象,而不具体明确指定具体类。
 71 |     抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么。这样客户就可以从具体产品中被解耦。
 72 |   备注:
 73 |     与工厂方法类似,定义一组抽象方法
 74 |   常用场景:需要一个接口可以提供一个产品组,且不必知道产品的具体种类。
 75 |   选择关键点:产品组是否需要一起提供,且是否有一致的接口。
 76 |   逆鳞:-
 77 | 
78 |
79 |
80 |

建造者

81 |
 82 |   介绍:
 83 |     在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成
 84 |   备注:
 85 |     操作类写步骤,参数抽象,具体实现在参数抽象中
 86 |   常用场景:需要构建一批构建过程相同但表示不同的产品,而构建过程非常复杂。
 87 |   选择关键点:各个产品的构建过程是否相同
 88 |   逆鳞:指挥者不能正常工作
 89 | 
90 |
91 |
92 |

原型

93 |
 94 |   介绍:
 95 |     只创建一个类实例对象,如果后面需要更多这样的实例,可以通过对原来对象拷贝一份来完成创建,这样在内存中不需要创建多个相同的类实例,从而减少内存的消耗和达到类实例的复用
 96 |   备注:
 97 |     只有一个实例,以后创建需要从这个实例进行拷贝。分为深拷贝和浅拷贝
 98 |   常用场景:需要在运行时动态的创建指定实例种类的对象,或是需要复用其状态
 99 |   选择关键点:创建出来的对象是否可以立即投入使用
100 |   逆鳞:在以为是深度拷贝的情况下,却未实现深度拷贝
101 | 
102 |
103 | 104 | -------------------------------------------------------------------------------- /HE23DesignPatterns/设计摘要/结构型模式.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 结构型模式 6 | 7 | 8 |
9 | 返回顶部 10 |
11 |

上一个  结构型模式  下一个

12 |
 13 |   结构型模式,顾名思义讨论的是类和对象的结构,主要用处理类或对象的组合。
 14 |   它包括两种类型:
 15 |   一、类结构型模式,指的是采用继承机制来组合接口或实现;
 16 |   二、对象结构型模式,指的是通过组合对象的方式来实现新的功能。
 17 |   包括:适配器模式桥接模式装饰者模式组合模式外观模式、
 18 |   	    享元模式代理模式
 19 | 
20 |
21 |
    22 |
  • 适配器模式注重转换接口,将不吻合的接口适配对接
  • 23 |
  • 桥接模式注重分离接口与其实现,支持多维度变化
  • 24 |
  • 组合模式注重统一接口,将“一对多”的关系转换为“一对一”的关系
  • 25 |
  • 装饰者模式注重稳定接口,在此前提下为对象扩展功能
  • 26 |
  • 外观模式注重简化接口,简化组件系统与外部客户程序的依赖关系
  • 27 |
  • 享元模式注重保留接口,在内部使用共享技术对对象存储进行优化
  • 28 |
  • 代理模式注重假借接口,增加间接层来实现灵活控制
  • 29 |
30 |
31 |
32 |

适配器模式

33 |
 34 |   介绍:
 35 |     把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。
 36 |     适配器模式有类的适配器和对象的适配器两种形式
 37 |   备注:
 38 |     目标角色是接口,源角色是抽象类。需要根据适配器把,源角色转换为目标角色。适配器类继承抽象类、源角色接口。并返回源角色
 39 |     目标角色是方法,源角色是方法。适配器类继承目标角色,内部返回源角色
 40 |   常用场景:需要使用一个类的功能,但是该类的接口不符合使用场合要求的接口,可使用定制适配器,又或者是有一个接口定义的行为过多,则可以定义一个缺省适配器,让子类选择性的覆盖适配器的方法。
 41 |   选择关键点:定制适配器的选择关键点在于是否有更加优良的替代方案,缺省适配器的选择关键点在于接口中的方法是否可以不全部提供,且都有缺省方案。
 42 |   逆鳞:-
 43 | 	
44 |
45 |
46 |

桥接模式

47 |
 48 |   介绍:
 49 |     抽象化和实现部分在一起,桥接模式的目的就是使两者分离,根据面向对象的封装变化的原则,我们可以把实现部分的变化(也就是遥控器功能的变化)封装到另外一个类中
 50 |   备注:
 51 |     重写抽象类中某一个方法,派生类继承抽象类,在派生类重写该方法,实例化的时候,实例派生类
 52 |   常用场景:一个对象有多个维度的变化,需要将这些维度抽离出来,让且独立变化。
 53 |   选择关键点:是否可以将对象拆分成多个不相关的维度。
 54 |   逆鳞:-
 55 | 	
56 |
57 |
58 |

装饰器模式

59 |
 60 |   介绍:
 61 |     装饰者模式来动态地给一个对象添加额外的职责。
 62 |     装饰者模式以对客户透明的方式动态地给一个对象附加上更多的责任,装饰者模式相比生成子类可以更灵活地增加功能
 63 |   备注:
 64 |     抽象类派生一个装饰类,装饰类派生不同的方法。如果有需要就重写方法,没有需要就base执行。调用的时候,装饰类初始化装饰派生类
 65 |   常用场景:一个类需要动态的添加功能,且这些功能可以相互叠加
 66 |   选择关键点:添加的功能是否要动态组装
 67 |   逆鳞:-
 68 | 	
69 |
70 |
71 |

组合模式

72 |
 73 |   介绍:
 74 |     组合模式允许你将对象组合成树形结构来表现”部分-整体“的层次结构,使得客户以一致的方式处理单个对象以及对象的组合
 75 |     组合模式实现的最关键的地方是——简单对象和复合对象必须实现相同的接口。这就是组合模式能够将组合对象和简单对象进行一致处理的原因。
 76 |   备注:
 77 |     分为透明模式和安全模式,透明模式所有都遵循一个接口,安全模式会在派生类添加额外方法实现。
 78 |   常用场景:当有一个结构可以组合成树形结构,且需要向客户端提供一致的操作接口,使得客户端操作忽略简单元素与复杂元素
 79 |   选择关键点:对外提供一致操作接口的结构是否可以转化为树形结构。
 80 |   逆鳞:结构不稳定或结构中的节点有递归关系。
 81 | 	
82 |
83 |
84 |

外观模式

85 |
 86 |   介绍:
 87 |     外观模式提供了一个统一接口,用来访问子系统的一群接口。外观定义了一个高级接口,让子系统更容易接受。
 88 |     外观模式的实现核心主要是——由外观类去保存各个子系统的引用,实现由一个统一的外观类去包装多个子系统类,然而客户端只需要引用这个外观类,然后由外观类来调用各个子系统中的方法
 89 |   备注:
 90 |     就是把多种方法,组合成一个任务链,访问只需要访问任务链即可。任务链内部自动添加其他任务
 91 |   常用场景:一个子系统需要对外提供服务
 92 |   选择关键点:子系统对外提供服务是否需要依赖很多的类
 93 |   逆鳞:子系统对外提供的服务的变化或子系统本身的不稳定
 94 | 	
95 |
96 |
97 |

享元模式

98 |
 99 |   介绍:
100 |     运用共享技术有效地支持大量细粒度的对象。享元模式可以避免大量相似类的开销,
101 |     在软件开发中如果需要生成大量细粒度的类实例来表示数据,如果这些实例除了几个参数外基本上都是相同的,这时候就可以使用享元模式来大幅度减少需要实例化类的数量。
102 |   备注:
103 |     如果对象只有某些字段不同,可以使用。将不同的字段存储,然后 返回同一个对象。
104 |   常用场景:一些状态相同的对象被大量的重复使用
105 |   选择关键点:被共享的对象是否可以将外部状态提取出来
106 |   逆鳞:没有将外部状态提取完全
107 | 	
108 |
109 |
110 |

代理模式

111 |
112 |   介绍:
113 |     就是给某一个对象提供一个代理,并由代理对象控制对原对象的引用。
114 |     在一些情况下,一个客户不想或者不能直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。例如电脑桌面的快捷方式就是一个代理对象,快捷方式是它所引用的程序的一个代理。
115 |   备注:
116 |     把多种操作封装成一个地方,然后供客户端调用
117 |   常用场景:需要修改或屏蔽某一个或若干个类的部分功能,复用另外一部分功能,可使用静态代理,若是需要拦截一批类中的某些方法,在方法的前后插入一些一致的操作,假设这些类有一致的接口,可使用动态代理。
118 |   选择关键点:静态代理选择的关键点是是否需要复用被代理的部分功能,动态代理选择的关键点在于能否在将被代理的这一批类当中,找出相同的切入点。
119 |   逆鳞:切入点的不稳定
120 | 	
121 |
122 | 123 | -------------------------------------------------------------------------------- /HE23DesignPatterns/设计摘要/行为型模式.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 行为型模式 6 | 7 | 8 |
9 | 返回顶部 10 |
11 |

上一个  行为型模式

12 |
行为型模式是对在不同对象之间划分责任和算法的抽象化。行为模式不仅仅关于类和对象,还关于它们之间的相互作用。行为型模式又分为类的行为模式和对象的行为模式两种。
13 |
14 |
    15 |
  • 类的行为模式——使用继承关系在几个类之间分配行为。
  • 16 |
  • 对象的行为模式——使用对象聚合的方式来分配行为。
  • 17 |
18 |
19 | 行为型模式包括11种模式: 20 | 模板方法模式、 21 | 命令模式、 22 | 迭代器模式、 23 | 观察者模式、 24 | 中介者模式、 25 | 状态模式、 26 | 策略模式、 27 | 责任链模式、 28 | 访问者模式、 29 | 解释器模式、 30 | 备忘录模式 31 | 32 |
33 |
    34 |
  • 模板方法模式:封装算法结构,定义算法骨架,支持算法子步骤变化。
  • 35 |
  • 命令模式:注重将请求封装为对象,支持请求的变化,通过将一组行为抽象为对象,实现行为请求者和行为实现者之间的解耦。
  • 36 |
  • 迭代器模式:注重封装特定领域变化,支持集合的变化,屏蔽集合对象内部复杂结构,提供客户程序对它的透明遍历。
  • 37 |
  • 观察者模式:注重封装对象通知,支持通信对象变化,实现对象状态改变,通知依赖它的对象并更新。
  • 38 |
  • 中介者模式:注重封装对象见的交互,通过封装一系列对象之间的复杂交互,使他们不需要显示相互引用,实现解耦。
  • 39 |
  • 状态模式:注重封装与状态相关的行为,支持状态的变化,通过封装对象状态,从而在其内部状态改变时改变它的行为。
  • 40 |
  • 策略模式:注重封装算法,支持算法的变化,通过封装一系列算法,从而可以随时独立于客户替换算法。
  • 41 |
  • 责任链模式:注重封装对象责任,支持责任的变化,通过动态构建职责连,实现事务处理。
  • 42 |
  • 访问者模式:注重封装对象操作变化,支持在运行时为类结构添加新的操作,在类层次结构中在不改变各类的前提下定义作用于这些类实现的新的操作。
  • 43 |
  • 备忘录模式:注重封装对象状态变化,支持状态保存,恢复
  • 44 |
  • 解释器模式:注重封装特定领域变化,支持领域问题的频繁变化,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解释器来解释这样的句子,从而达到解决问题的目的。
  • 45 |
46 |
47 |
48 |

模板方式模式

49 |
 50 |   介绍:
 51 |   	在一个抽象类中定义一个操作算法的骨架,将一些步骤延迟到子类中去实现。
 52 |   备注:
 53 |   	定不变的封装到抽象类中,需要改变的在子类中去实现。
 54 |   常用场景:一批子类的功能有可提取的公共算法骨架
 55 |   选择关键点:算法骨架是否牢固
 56 |   逆鳞:-
 57 | 
58 |
59 |
60 |

命令模式

61 |
 62 |   介绍:
 63 |   	命令模式是把一个操作或者行为抽象为一个对象中,通过对命令的抽象化来使得发出命令的责任和执行命令的责任分隔开。
 64 |   备注:
 65 |   	将命令的接受者、发送者、具体命令、执行要求分开。具体命令抽象
 66 |   常用场景:行为的请求者与行为的处理者耦合度过高
 67 |   选择关键点:请求者是否不需要关心命令的执行只知道接受者
 68 |   逆鳞:命令种类的无限增长
 69 | 		
70 |
71 |
72 |

迭代器模式

73 |
 74 |   介绍:
 75 |   迭代器模式提供了一种方法顺序访问一个聚合对象(理解为集合对象)中各个元素,而又无需暴露该对象的内部表示,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。
 76 |   备注:
 77 |   聚合对象,如需要操作。则额外建立一个迭代器类。对集合进行操作处理
 78 | 		
79 |
80 |
81 |

观察者模式

82 |
 83 |   介绍:
 84 |   	观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的行为。
 85 |   备注:
 86 |   	信息传递机制进行解耦操作,传递的均是信息接口
 87 |   常用场景:需要将观察者与被观察者解耦或是观察者的种类不确定
 88 |   选择关键点:观察者与被观察者是否是多对一的关系
 89 |   逆鳞:观察者之间有过多的细节依赖
 90 | 		
91 |
92 |
93 |

中介者模式

94 |
 95 |   介绍:
 96 |   	定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为
 97 |   备注:
 98 |   	禁止类之间相互交互,封装个各类之间的行为
 99 |   常用场景:一个系列的对象交互关系十分复杂
100 |   选择关键点:复杂的交互关系是否有共性可被中介者承担
101 |   逆鳞:中介者无法工作
102 | 		
103 |
104 |
105 |

状态模式

106 |
107 |   介绍:
108 |   	允许一个对象在其内部状态改变时自动改变其行为,对象看起来就像是改变了它的类。
109 |   备注:
110 |   	由于状态的改变,会改变派生类,产生不同的重载方法。
111 |   常用场景:一个对象在多个状态下行为不同,且这些状态可互相转换
112 |   选择关键点:这些状态是否经常在运行时需要在不同的动态之间相互切换
113 |   逆鳞:-
114 | 		
115 |
116 |
117 |

策略模式

118 |
119 |   介绍:
120 |   	策略模式是针对一组算法,将每个算法封装到具有公共接口的独立的类中,从而使它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
121 |   备注:
122 |   	将方法或者算法,抽象成类,有区别的算法对这个类进行继承。然后多态去实现
123 |   常用场景:算法或策略需要经常替换
124 |   选择关键点:客户端是否依赖于某一个或若干个具体的策略
125 |   逆鳞:-
126 | 		
127 |
128 |
129 |

责任链模式

130 |
131 |   介绍:
132 |   	某个请求需要多个对象进行处理,从而避免请求的发送者和接收之间的耦合关系。将这些对象连成一条链子,并沿着这条链子传递该请求,直到有对象处理它为止。
133 |   备注:
134 |   	审批人抽象,派生类中定义上级人员。调用时,制定上级人员。当请求不满足时,根据自动跳转上级人员。调用从最低开始。
135 |   常用场景:一个请求的处理需要多个对象当中的一个或几个协作处理。
136 |   选择关键点:对于每一个请求是否每个处理的对象都需要一次处理机会。
137 |   逆鳞:-
138 | 		
139 |
140 |
141 |

访问者模式

142 |
143 |   介绍:
144 |   	数据结构的每一个节点都可以接受一个访问者的调用,此节点向访问者对象传入节点对象,而访问者对象则反过来执行节点对象的操作。
145 |   备注:
146 |   	真个数据结构的方法与数据结构分离,定义访问类去找他的方法。
147 |   常用场景:作用于一个数据结构之上的操作经常变化
148 |   选择关键点:数据结构是否稳定以及操作是否经常变化
149 |   逆鳞:数据结构的不稳定
150 | 		
151 |
152 |
153 |

备忘录模式

154 |
155 |   介绍:
156 |   	在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以把该对象恢复到原先的状态。
157 |   备注:
158 |   	对象保存静态,可用list进行扩展,类似于撤消操作
159 |   常用场景:需要在对象的外部保存该对象的内部状态
160 |   选择关键点:是否可以在必要的时候捕捉到对象的内部状态
161 |   逆鳞:大对象的备份
162 | 		
163 |
164 |
165 |

解释器模式

166 |
167 |   介绍:
168 |   	解释器模式描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。
169 |   备注:
170 |   	使用键值对,转换对应的语言
171 |   常用场景:有一种语言被频繁的使用
172 |   选择关键点:被频繁使用的语言是否可用文法表示
173 |   逆鳞:语言的规则无限制增长或规则十分不稳定
174 | 		
175 |
176 | 177 | -------------------------------------------------------------------------------- /HE23DesignPatterns/设计摘要/设计原则.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 设计模式 6 | 7 | 8 |
9 | 返回顶部 10 |
11 |

设计原则

12 |
 13 |   使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性。并且,在进行设计的时候,
 14 |   也需要遵循以下几个原则:单一职责原则开闭原则里氏替换原则依赖倒置原则接口隔离原则合成复用原则迪米特法则
 15 |   下面就分别介绍每种设计原则。
 16 | 
17 |
18 |

单一职责原则

19 |
 20 |   说明:
 21 |   就一个类而言,应该只有一个引起它变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会影响到其他的职责,另外
 22 |   把多个职责耦合在一起,也会影响复用性。
 23 |   理解:
 24 |   一个类就管一种事情
 25 | 
26 |
27 |
28 |

开闭原则

29 |
 30 |   说明:
 31 |   开闭原则即OCP(Open-Closed Principle缩写)原则,该原则强调的是:一个软件实体(指的类、函数、模块等)应该对扩展开放,对修改关闭。
 32 |   即每次发生变化时,要通过添加新的代码来增强现有类型的行为,而不是修改原有的代码。
 33 |   符合开闭原则的最好方式是提供一个固有的接口,然后让所有可能发生变化的类实现该接口,让固定的接口与相关对象进行交互。
 34 |   理解:
 35 |   少改写好的代码
 36 | 
37 |
38 |
39 |

里氏替换原则

40 |
 41 |   说明:
 42 |   Liskov Substitution Principle,LSP(里氏代替原则)指的是子类必须替换掉它们的父类型。
 43 |   也就是说,在软件开发过程中,子类替换父类后,程序的行为是一样的。
 44 |   只有当子类替换掉父类后,此时软件的功能不受影响时,父类才能真正地被复用,而子类也可以在父类的基础上添加新的行为。
 45 |   理解:
 46 |   父类要保证通用性
 47 | 
48 |
49 |
50 |

依赖倒置原则

51 |
 52 |   说明:
 53 |   依赖倒置(Dependence Inversion Principle, DIP)原则指的是抽象不应该依赖于细节,细节应该依赖于抽象,
 54 |   也就是提出的 “面向接口编程,而不是面向实现编程”。这样可以降低客户与具体实现的耦合。
 55 |   理解:
 56 |   方法出一个接口,接口具体实现的方法单说
 57 | 
58 |
59 |
60 |

接口隔离原则

61 |
 62 |   说明:
 63 |   接口隔离原则(Interface Segregation Principle, ISP)指的是使用多个专门的接口比使用单一的总接口要好。
 64 |   也就是说不要让一个单一的接口承担过多的职责,而应把每个职责分离到多个专门的接口中,进行接口分离。过于臃肿的接口是对接口的一种污染。
 65 |   理解:
 66 |   跟单一职责相似,一个接口就管一种事
 67 | 
68 |
69 |
70 |

合成复用原则

71 |
 72 |   说明:
 73 |   合成复用原则(Composite Reuse Principle, CRP)就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分。
 74 |   新对象通过向这些对象的委派达到复用已用功能的目的。简单地说,就是要尽量使用合成/聚合,尽量不要使用继承。
 75 |   要使用好合成复用原则,首先需要区分”Has—A”和“Is—A”的关系。
 76 |   “Is—A”是指一个类是另一个类的“一种”,是属于的关系。
 77 |   “Has—A”则不同,它表示某一个角色具有某一项责任。
 78 |   理解:
 79 |   如果你确定两件对象之间是is-a的关系,那么此时你应该使用继承;比如菱形、圆形和方形都是形状的一种,那么他们都应该从形状类继承而不是聚合。
 80 |   如果你确定两件对象之间是has-a的关系,那么此时你应该使用聚合;比如电脑是由显示器、CPU、硬盘等组成的,
 81 |   那么你应该把显示器、CPU、硬盘这些类聚合成电脑类,而不是从电脑类继承。
 82 |   就是拼方法实现
 83 | 
84 |
85 |
86 |

迪米特法则

87 |
 88 |   迪米特法则(Law of Demeter,LoD)又叫最少知识原则(Least Knowledge Principle,LKP),指的是一个对象应当对其他对象有尽可能少的了解。
 89 |   也就是说,一个模块或对象应尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立,这样当一个模块修改时,影响的模块就会越少,扩展起来更加容易。
 90 |   关于迪米特法则其他的一些表述有:只与你直接的朋友们通信;不要跟“陌生人”说话。
 91 | 
92 |
93 | 94 |

设计模式列表

95 | 100 | 101 | -------------------------------------------------------------------------------- /HE23DesignPatterns/访问者模式/Client.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Client 4 | // created by 朱锦润 5 | // created time 2017/07/08 14:23:22 6 | //-------------------------------------------- 7 | using System; 8 | using System.Collections; 9 | 10 | namespace DesignMethod.访问者模式 11 | { 12 | //抽象访问者 13 | public interface IVistor 14 | { 15 | void Visit(ElementA a); 16 | 17 | void Visit(ElementB b); 18 | } 19 | 20 | //具体访问者 21 | public class ConcreteVistor : IVistor 22 | { 23 | //再去调用元素 24 | public void Visit(ElementA a) 25 | { 26 | a.Print(); 27 | } 28 | 29 | public void Visit(ElementB b) 30 | { 31 | b.Print(); 32 | } 33 | } 34 | 35 | //抽象元素角色 36 | public abstract class Element 37 | { 38 | public abstract void Accept(IVistor vistor); 39 | 40 | public abstract void Print(); 41 | } 42 | 43 | //具体元素A 44 | public class ElementA : Element 45 | { 46 | public override void Accept(IVistor vistor) 47 | { 48 | //调用访问者vilist 49 | vistor.Visit(this); 50 | } 51 | 52 | public override void Print() 53 | { 54 | Console.WriteLine("我是元素A"); 55 | } 56 | } 57 | 58 | //具体元素B 59 | public class ElementB : Element 60 | { 61 | public override void Accept(IVistor vistor) 62 | { 63 | vistor.Visit(this); 64 | } 65 | 66 | public override void Print() 67 | { 68 | Console.WriteLine("我是元素B"); 69 | } 70 | } 71 | 72 | //对象结构 73 | public class ObjectStructure 74 | { 75 | private ArrayList element = new ArrayList(); 76 | 77 | public ObjectStructure() 78 | { 79 | Random ran = new Random(); 80 | for (int i = 0; i < 6; i++) 81 | { 82 | int ranNum = ran.Next(10); 83 | if (ranNum > 5) 84 | { 85 | element.Add(new ElementA()); 86 | } 87 | else 88 | { 89 | element.Add(new ElementB()); 90 | } 91 | } 92 | } 93 | 94 | public ArrayList Element 95 | { 96 | get { return element; } 97 | } 98 | } 99 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/访问者模式/Program.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Program 4 | // created by 朱锦润 5 | // created time 2017/07/08 14:22:59 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.访问者模式 10 | { 11 | public class Program : OpenDesign 12 | { 13 | public override void Open() 14 | { 15 | ObjectStructure objectstructure = new ObjectStructure(); 16 | foreach (Element e in objectstructure.Element) 17 | { 18 | e.Accept(new ConcreteVistor()); 19 | } 20 | 21 | Console.Read(); 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/责任链模式/Client.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Client 4 | // created by 朱锦润 5 | // created time 2017/07/08 13:29:03 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.责任链模式 10 | { 11 | //审批人 12 | public abstract class Approver 13 | { 14 | public Approver(string name) 15 | { 16 | this.Name = name; 17 | } 18 | 19 | public string Name { get; set; } 20 | public Approver NextApprover { get; set; } 21 | 22 | public abstract void ProcessRequest(PurchaseRequest request); 23 | } 24 | 25 | //管理者 26 | public class Manager : Approver 27 | { 28 | public Manager(string name) 29 | : base(name) { } 30 | 31 | public override void ProcessRequest(PurchaseRequest request) 32 | { 33 | if (request.Amount < 10000.0) 34 | { 35 | Console.WriteLine("{0}-{1} approved the request of purshing {2}", this, Name, request.ProductName); 36 | } 37 | else 38 | { 39 | NextApprover.ProcessRequest(request); 40 | } 41 | } 42 | } 43 | 44 | //总经理 45 | public class President : Approver 46 | { 47 | public President(string name) 48 | : base(name) { } 49 | 50 | public override void ProcessRequest(PurchaseRequest request) 51 | { 52 | if (request.Amount < 100000.0) 53 | { 54 | Console.WriteLine("{0}-{1} approved the request of purshing {2}", this, Name, request.ProductName); 55 | } 56 | else 57 | { 58 | Console.WriteLine("Request需要组织一个会议"); 59 | } 60 | } 61 | } 62 | 63 | //采购请求 64 | public class PurchaseRequest 65 | { 66 | public PurchaseRequest(double amount, string productName) 67 | { 68 | Amount = amount; 69 | ProductName = productName; 70 | } 71 | 72 | //金额 73 | public double Amount { get; set; } 74 | 75 | //产品名称 76 | public string ProductName { get; set; } 77 | } 78 | 79 | //副总 80 | public class VicePresident : Approver 81 | { 82 | public VicePresident(string name) 83 | : base(name) { } 84 | 85 | public override void ProcessRequest(PurchaseRequest request) 86 | { 87 | if (request.Amount < 25000.0) 88 | { 89 | Console.WriteLine("{0}-{1} approved the request of purshing {2}", this, Name, request.ProductName); 90 | } 91 | else 92 | { 93 | NextApprover.ProcessRequest(request); 94 | } 95 | } 96 | } 97 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/责任链模式/Program.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Program 4 | // created by 朱锦润 5 | // created time 2017/07/08 13:28:13 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.责任链模式 10 | { 11 | public class Program : OpenDesign 12 | { 13 | public override void Open() 14 | { 15 | PurchaseRequest requestTelphone = new PurchaseRequest(4000.0, "Telphone"); 16 | PurchaseRequest requestSoftware = new PurchaseRequest(10000.0, "Visual Studio"); 17 | PurchaseRequest requestComputers = new PurchaseRequest(40000.0, "Computers"); 18 | 19 | Approver manager = new Manager("LearningHard"); 20 | Approver Vp = new VicePresident("Tony"); 21 | Approver Pre = new President("BoosTom"); 22 | 23 | //设置责任链 24 | manager.NextApprover = Vp; 25 | Vp.NextApprover = Pre; 26 | 27 | //处理请求 28 | manager.ProcessRequest(requestTelphone); 29 | manager.ProcessRequest(requestSoftware); 30 | manager.ProcessRequest(requestComputers); 31 | Console.Read(); 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/迭代器模式/Client.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Client 4 | // created by 朱锦润 5 | // created time 2017/07/07 11:12:11 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.迭代器模式 10 | { 11 | //抽象聚合类 12 | public interface IListCollection 13 | { 14 | Iterator GetIterator(); 15 | } 16 | 17 | //抽象迭代器 18 | public interface Iterator 19 | { 20 | Object GetCurrent(); 21 | 22 | bool MoveNext(); 23 | 24 | void Next(); 25 | 26 | void Reset(); 27 | } 28 | 29 | //具体迭代器类 30 | public class ConcreteInterator : Iterator 31 | { 32 | private int _index; 33 | 34 | //迭代器要集合对象进行遍历操作,自然就需要引用集合对象 35 | private ConcreteList _list; 36 | 37 | public ConcreteInterator(ConcreteList list) 38 | { 39 | _list = list; 40 | _index = 0; 41 | } 42 | 43 | public object GetCurrent() 44 | { 45 | return _list.GetElement(_index); 46 | } 47 | 48 | public bool MoveNext() 49 | { 50 | if (_index < _list.Length) 51 | { 52 | return true; 53 | } 54 | return false; 55 | } 56 | 57 | public void Next() 58 | { 59 | if (_index < _list.Length) 60 | { 61 | _index++; 62 | } 63 | } 64 | 65 | public void Reset() 66 | { 67 | _index = 0; 68 | } 69 | } 70 | 71 | //具体聚合类 72 | public class ConcreteList : IListCollection 73 | { 74 | private int[] collection; 75 | 76 | public ConcreteList() 77 | { 78 | collection = new int[] { 2, 4, 6, 8 }; 79 | } 80 | 81 | public int Length 82 | { 83 | get { return collection.Length; } 84 | } 85 | 86 | public int GetElement(int index) 87 | { 88 | return collection[index]; 89 | } 90 | 91 | public Iterator GetIterator() 92 | { 93 | return new ConcreteInterator(this); 94 | } 95 | } 96 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/迭代器模式/Program.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Program 4 | // created by 朱锦润 5 | // created time 2017/07/07 11:11:44 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.迭代器模式 10 | { 11 | public class Program : OpenDesign 12 | { 13 | public override void Open() 14 | { 15 | Iterator iterator; 16 | IListCollection list = new ConcreteList(); 17 | iterator = list.GetIterator(); 18 | 19 | while (iterator.MoveNext()) 20 | { 21 | int i = (int)iterator.GetCurrent(); 22 | Console.WriteLine(i.ToString()); 23 | iterator.Next(); 24 | } 25 | Console.Read(); 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/适配器/CilentClass.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :CilentClass 4 | // created by 朱锦润 5 | // created time 2017/07/03 14:17:22 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.适配器 10 | { 11 | /// 12 | /// 目标角色 13 | /// 14 | public interface IThreeHole 15 | { 16 | void Requset(); 17 | } 18 | 19 | /// 20 | /// 适配器类 21 | /// 22 | public class PowerAdpter : TwoHole, IThreeHole 23 | { 24 | public void Requset() 25 | { 26 | this.SpecificRequest(); 27 | } 28 | } 29 | 30 | /// 31 | /// 源角色需要适配的类 32 | /// 33 | public class TwoHole 34 | { 35 | public void SpecificRequest() 36 | { 37 | Console.WriteLine("我是两个孔的插头"); 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/适配器/CilentObject.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :CilentObject 4 | // created by 朱锦润 5 | // created time 2017/07/03 14:17:31 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.适配器 10 | { 11 | /// 12 | /// 适配器类 13 | /// 14 | public class PowerAdapter : ThreeHole2 15 | { 16 | //引用实例 17 | public TwoHole2 twh = new TwoHole2(); 18 | 19 | public override void Request() 20 | { 21 | twh.SpecificRequest(); 22 | } 23 | } 24 | 25 | /// 26 | /// 三个孔插头,目标角色 27 | /// 28 | public class ThreeHole2 29 | { 30 | //客户端需要的方法 31 | public virtual void Request() 32 | { 33 | //可以把一般实现放在这里 34 | Console.WriteLine("我是三个孔插头"); 35 | } 36 | } 37 | 38 | /// 39 | /// 两个孔插头,源角色 40 | /// 41 | public class TwoHole2 42 | { 43 | public void SpecificRequest() 44 | { 45 | Console.WriteLine("我是两个孔插头"); 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /HE23DesignPatterns/适配器/Program.cs: -------------------------------------------------------------------------------- 1 | //-------------------------------------------- 2 | // Copyright (C) 武汉一世计科软件有限公司 3 | // filename :Program 4 | // created by 朱锦润 5 | // created time 2017/07/03 14:17:02 6 | //-------------------------------------------- 7 | using System; 8 | 9 | namespace DesignMethod.适配器 10 | { 11 | public class Program : OpenDesign 12 | { 13 | public override void Open() 14 | { 15 | #region OpenClass 16 | 17 | IThreeHole threehole = new PowerAdpter(); 18 | threehole.Requset(); 19 | Console.ReadLine(); 20 | 21 | #endregion OpenClass 22 | 23 | #region OpenObject 24 | 25 | ThreeHole2 three = new PowerAdapter(); 26 | three.Request(); 27 | Console.ReadLine(); 28 | 29 | #endregion OpenObject 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AlgorithmAndDesignPartten 2 | 基于C#语言的查找、排序算法以及23设计模式的汇总 3 | -------------------------------------------------------------------------------- /基于C#的23种设计模式.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Run2948/AlgorithmAndDesignPartten/ee365382368c6a97be3c45c13745d17f6095f586/基于C#的23种设计模式.pdf -------------------------------------------------------------------------------- /数据结构与算法:C#语言描述(中文).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Run2948/AlgorithmAndDesignPartten/ee365382368c6a97be3c45c13745d17f6095f586/数据结构与算法:C#语言描述(中文).pdf --------------------------------------------------------------------------------