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