提到到设计模式,很多人可能会困惑,甚至是反感.到处都看到文章说设计模式是如何的重要,但是自己写代码的时候却发现很少用到设计模式,甚至可能觉得这是个沽名钓誉的东西,谈不清也说不明.
确实我之前也觉得设计模式是非常的高深,很难接触一二,但是通过不断的写代码,写完后再回顾总结的时候,却发现设计模式确实给我们指出了一条明道,只有通过实际项目的体会,才能明白其中道理,就像兵书读的再多,没有实际带兵打过仗,不过是纸上谈兵而已.
我在不断工作中时常会停下来做些思考,希望能给写过的代码找到一些归宿,能够让这些代码能够更好的被复用,易扩展.
因为做的电子商务网站,接触到最多的就是各种各样的打折方式了,逢年过节就要搞一个促销,比如什么满300送100了,买一件第二件对折了,什么商品的积分翻倍了,什么买三送一了,总之就是非常的多.
之前写代码很规矩,老老实实的写,购物车中有多少商品,数量是多少,然后价格乘以数量就ok了.后来就不对劲了市场部总是提出一个又一个折腾人的促销方式,没办法,得满足啊,谁叫咱是程序员呢,呵呵.
写了2个,3个促销方式之后,发现了他们有很多通用的地方,这个时候就想谋求有什么好的解决方案了.既然他们有很多公共的地方,那么就可以把他们抽象出来放在一个父类里面,其他的促销方式继承这个父类,然后重写里面的计算方法就可以了.
比如:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
1![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
using System;
4![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
using System.Collections.Generic;
6![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
7
using System.Web;
8![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9
10![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
11
namespace Study
12![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
13![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
14![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
public abstract class Sell
16![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
18![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
private List<ShoppingCartItem> _list;
20![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
22![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
24![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
25
/// 购物车
26![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
27
/// </summary>
28![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
29
public List<ShoppingCartItem> List
30![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
31![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
32![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
33![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return _list; }
34![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
35![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ _list = value; }
36![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
37
}
38![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
39
40![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
41![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
42![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
43
/// 计算金额
44![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
45
/// </summary>
46![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
47
/// <returns></returns>
48![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
49
public abstract decimal GetAmount();
50![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
51
52![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
53
}
54![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
55
56![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
57
public class SellHalf : Sell
58![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
59![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
60![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
61
public override decimal GetAmount()
62![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
63![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
64![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
65
//todo
66![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
67
return 111;
68![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
69
//throw new NotImplementedException();
70![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
71
}
72![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
73
}
74![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
75
76![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
77
public class SellSend : Sell
78![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
79![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
80![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
81
public override decimal GetAmount()
82![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
83![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
84![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
85
86![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
87
return 222;
88![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
89
//throw new NotImplementedException();
90![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
91
}
92![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
93
}
94![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
95
96![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
97
public class SellContext
98![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
99![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
100![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
101
Sell sell;
102![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
103
104![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
105
public SellContext(string type)
106![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
107![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
108![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
109
if (type == "1")
110![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
111
sell = new SellHalf();
112![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
113
else
114![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
115
sell = new SellSend();
116![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
117
}
118![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
119
120![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
121
public decimal GetAmount()
122![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
123![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
124![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
125
return sell.GetAmount();
126![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
127
}
128![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
129
}
130![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
131
132![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
133
public class SellFactory
134![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
135![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
136![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
137
public static Sell CreateSell(string type)
138![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
139![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
140![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
141
if (type == "1")
142![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
143
return new SellHalf();
144![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
145
else
146![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
147
return new SellSend();
148![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
149
}
150![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
151
}
152![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
153
154![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
155
public class ShoppingCartItem
156![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
157![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
158![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
159
160![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
161
}
162![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
163
}
164![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
165
166![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
167
168![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
169
class Program
170![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
171![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
172![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
173
static void Main(string[] args)
174![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
175![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
176![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
177
//简单工厂模式
178![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
179
Sell sell = SellFactory.CreateSell(Console.ReadLine());
180![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
181
Console.WriteLine(sell.GetAmount().ToString());
182![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
183
184![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
185
//策略模式
186![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
187
SellContext cnt = new SellContext(Console.ReadLine());
188![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
189
Console.WriteLine(cnt.GetAmount().ToString());
190![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
191
192![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
193
Console.ReadLine();
194![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
195
196![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
197
}
198![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
199
200![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
201
static void Write1()
202![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
203![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
204![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
205
Console.WriteLine("1");
206![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
207
}
208![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
209
210![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
211
static void Write2()
212![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
213![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
214![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
215
Console.WriteLine("2");
216![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
217
}
218![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
219
}
220![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
221
222![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
223![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
这里就涉及到职责单一模式,简单改成模式和策略模式.
在学习设计模式的过程中,也能不断的体会到面向对象的魅力.
职责单一就是一个类的功能要越少越好,只有一个可以引起他改变的因素,这样他们功能很单一,便于复用不容易出错.
简单工厂模式就是在不同的情况下能够给我们提供不同的类型.
策略模式,其实跟简单工厂模式差不多,就是做了进一步的封装,