提到到设计模式,很多人可能会困惑,甚至是反感.到处都看到文章说设计模式是如何的重要,但是自己写代码的时候却发现很少用到设计模式,甚至可能觉得这是个沽名钓誉的东西,谈不清也说不明.
确实我之前也觉得设计模式是非常的高深,很难接触一二,但是通过不断的写代码,写完后再回顾总结的时候,却发现设计模式确实给我们指出了一条明道,只有通过实际项目的体会,才能明白其中道理,就像兵书读的再多,没有实际带兵打过仗,不过是纸上谈兵而已.
我在不断工作中时常会停下来做些思考,希望能给写过的代码找到一些归宿,能够让这些代码能够更好的被复用,易扩展.
因为做的电子商务网站,接触到最多的就是各种各样的打折方式了,逢年过节就要搞一个促销,比如什么满300送100了,买一件第二件对折了,什么商品的积分翻倍了,什么买三送一了,总之就是非常的多.
之前写代码很规矩,老老实实的写,购物车中有多少商品,数量是多少,然后价格乘以数量就ok了.后来就不对劲了市场部总是提出一个又一个折腾人的促销方式,没办法,得满足啊,谁叫咱是程序员呢,呵呵.
写了2个,3个促销方式之后,发现了他们有很多通用的地方,这个时候就想谋求有什么好的解决方案了.既然他们有很多公共的地方,那么就可以把他们抽象出来放在一个父类里面,其他的促销方式继承这个父类,然后重写里面的计算方法就可以了.
比如:

Code
1
2
3
using System;
4
5
using System.Collections.Generic;
6
7
using System.Web;
8
9
10
11
namespace Study
12
13

{
14
15
public abstract class Sell
16
17

{
18
19
private List<ShoppingCartItem> _list;
20
21
22
23
/**//// <summary>
24
25
/// 购物车
26
27
/// </summary>
28
29
public List<ShoppingCartItem> List
30
31

{
32
33
get
{ return _list; }
34
35
set
{ _list = value; }
36
37
}
38
39
40
41
/**//// <summary>
42
43
/// 计算金额
44
45
/// </summary>
46
47
/// <returns></returns>
48
49
public abstract decimal GetAmount();
50
51
52
53
}
54
55
56
57
public class SellHalf : Sell
58
59

{
60
61
public override decimal GetAmount()
62
63

{
64
65
//todo
66
67
return 111;
68
69
//throw new NotImplementedException();
70
71
}
72
73
}
74
75
76
77
public class SellSend : Sell
78
79

{
80
81
public override decimal GetAmount()
82
83

{
84
85
86
87
return 222;
88
89
//throw new NotImplementedException();
90
91
}
92
93
}
94
95
96
97
public class SellContext
98
99

{
100
101
Sell sell;
102
103
104
105
public SellContext(string type)
106
107

{
108
109
if (type == "1")
110
111
sell = new SellHalf();
112
113
else
114
115
sell = new SellSend();
116
117
}
118
119
120
121
public decimal GetAmount()
122
123

{
124
125
return sell.GetAmount();
126
127
}
128
129
}
130
131
132
133
public class SellFactory
134
135

{
136
137
public static Sell CreateSell(string type)
138
139

{
140
141
if (type == "1")
142
143
return new SellHalf();
144
145
else
146
147
return new SellSend();
148
149
}
150
151
}
152
153
154
155
public class ShoppingCartItem
156
157

{
158
159
160
161
}
162
163
}
164
165
166
167
168
169
class Program
170
171

{
172
173
static void Main(string[] args)
174
175

{
176
177
//简单工厂模式
178
179
Sell sell = SellFactory.CreateSell(Console.ReadLine());
180
181
Console.WriteLine(sell.GetAmount().ToString());
182
183
184
185
//策略模式
186
187
SellContext cnt = new SellContext(Console.ReadLine());
188
189
Console.WriteLine(cnt.GetAmount().ToString());
190
191
192
193
Console.ReadLine();
194
195
196
197
}
198
199
200
201
static void Write1()
202
203

{
204
205
Console.WriteLine("1");
206
207
}
208
209
210
211
static void Write2()
212
213

{
214
215
Console.WriteLine("2");
216
217
}
218
219
}
220
221
222
223
这里就涉及到职责单一模式,简单改成模式和策略模式.
在学习设计模式的过程中,也能不断的体会到面向对象的魅力.
职责单一就是一个类的功能要越少越好,只有一个可以引起他改变的因素,这样他们功能很单一,便于复用不容易出错.
简单工厂模式就是在不同的情况下能够给我们提供不同的类型.
策略模式,其实跟简单工厂模式差不多,就是做了进一步的封装,
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)