.NET架构演化从简单需求说起
因 为渴求进步,所以分享我所理解的设计模式。同时也为了抛砖引玉,因为你我都需要成长!
客户需求1:请为我们电子商务网站的电子类产品计算价格,并打印显示出来 . 可能出现的一个实现版本代码如下:
View Code
1 public class MP4
2 {
3 public MP4()
4 {
5 Name = " MP4 " ;
6 Price = 260 ;
7 }
8
9 public String Name
10 {
11 set ;
12 get ;
13 }
14 public Double Price
15 {
16 set ;
17 get ;
18 }
19
20 public void Print()
21 {
22 System.Console.WriteLine( " 商品{0} 价格:{1} " , Name, Price);
23 }
24 }
View Code
1 public class Pad
2 {
3 public Pad()
4 {
5 Name = " Pad " ;
6 Price = 3800 ;
7 }
8
9 public String Name
10 {
11 set ;
12 get ;
13 }
14 public Double Price
15 {
16 set ;
17 get ;
18 }
19
20 public void Print()
21 {
22 System.Console.WriteLine( " 商品{0} 价格:{1} " , Name, Price);
23 }
24 }
View Code
1 public class Phone
2 {
3 public Phone()
4 {
5 Name = " Phone " ;
6 Price = 4200 ;
7 }
8
9 public String Name
10 {
11 set ;
12 get ;
13 }
14 public Double Price
15 {
16 set ;
17 get ;
18 }
19
20 public void Print()
21 {
22 System.Console.WriteLine( " 商品{0} 价格:{1} " , Name, Price);
23 }
24 }
然后客户程序代码可能这样调用:
View Code
1 static void Main( string [] args)
2 {
3 MP4 mp4 = new MP4();
4 Pad pad = new Pad();
5 Phone phone = new Phone();
6 mp4.Print();
7 pad.Print();
8 phone.Print();
9 }
大家说这样实现有问题么?如果说客户需求是一尘不变的,价格也不会变,商品种类也不会增加,这样的实现是没有问题的,因为需求永远不会变。可实际生活中需求是一直在变化.
客户需求2:在节日期间,我们所有的商品的都打对折,且增加笔记本商品来销售。
需求变化了,缺乏工作经验的人可能会这样处理:打开类MP4把里边的价格260 * 0.5,再增加一个类Computer,然后编译发布程序。 请问这样做可以么?可以,因为它的确解决了我们的问题。但是不妨我们这样想一想以后如果需求还要变化,且很频繁,那么我们岂不是要不停的这样做重复的工作,这样不仅不利于系统的维护也不利于自己的成长.而且这样改变有许多风险.首先,我们改变了本不需要改变的功能代码(返回价格函数),还好这里只是返回一个简单的价格,如果里边包含了大量的业务逻辑判断那可麻烦了,更改时还要看懂业务逻辑。其次,如果这样的类有几十上百个甚至更多该怎么办,难道也要一个一个找出来改?如果改漏掉怎么办?再其次,如果我们以前的程序代码已经部署在公司好多电脑上,可能还要考虑接口的兼容性,以及请测试人员测试我们的代码功能。我们仅仅是改了一个不算复杂的功能,就要改动这么多东西,真是牵一发而动全身啊.那么怎样设计才能让我们避免此类问题出现,可以让我们的系统具有灵活性、可扩展、易维护、可复用,易阅读,才能更好适应需求的变化。
这里给出我的第一个版本设计, 整理后的的完整代码如下:
View Code
1 public abstract class Goods
2 {
3 public Goods()
4 {
5 Init();
6 }
7 public String Name
8 {
9 set ;
10 get ;
11 }
12 public Double Price
13 {
14 set ;
15 get ;
16 }
17 public IStrategy DisCountsStrategy
18 {
19 get ;
20 set ;
21 }
22 public void Print()
23 {
24 System.Console.WriteLine( " 商品{0} 价格:{1} " , Name, Price * DisCountsStrategy.DisCounts);
25 }
26 protected abstract void Init();
27 }
View Code
1 public class GoodsFactory : IGoodsFactory
2 {
3 Goods IGoodsFactory.MakeMP4()
4 {
5 return new MP4();
6 }
7
8 Goods IGoodsFactory.MakePad()
9 {
10 return new Pad();
11 }
12
13 Goods IGoodsFactory.MakePhone()
14 {
15 return new Phone();
16 }
17 }
View Code
1 public class GoodsStore : IStore
2 {
3 private IGoodsFactory goodsFactory;
4
5 public GoodsStore(IGoodsFactory goodsFactory)
6 {
7 this .goodsFactory = goodsFactory;
8 }
9
10 IEnumerator IStore.CreateGoods()
11 {
12 IList<Goods> goodsList = new List<Goods> ();
13 Goods mp4 = goodsFactory.MakeMP4();
14 Goods pad = goodsFactory.MakePad();
15 Goods phone = goodsFactory.MakePhone();
16 goodsList.Add(mp4);
17 goodsList.Add(pad);
18 goodsList.Add(phone);
19 return goodsList.GetEnumerator();
20 }
21
22 void IStore.Print(IEnumerator ienumerator)
23 {
24 while (ienumerator.MoveNext())
25 {
26 Goods goods = ienumerator.Current as Goods;
27 goods.Print();
28 }
29 }
30 }
View Code
1 public class HalfPercentStrategy : IStrategy
2 {
3 Double IStrategy.DisCounts
4 {
5 get { return 0.5 ; }
6 }
7 }
View Code
1 public interface IGoodsFactory
2 {
3 Goods MakeMP4();
4 Goods MakePad();
5 Goods MakePhone();
6 }
View Code
1 public interface IStore
2 {
3 IEnumerator CreateGoods();
4 void Print(IEnumerator ienumerator);
5 }
View Code
public interface IStrategy
{
Double DisCounts { get ; }
}
View Code
1 public class MP4 : Goods
2 {
3 protected override void Init()
4 {
5 Name = " MP4 " ;
6 Price = 260 ;
7 DisCountsStrategy = new HalfPercentStrategy();
8 }
9 }
View Code
1 public class OnePercentStrategy : IStrategy
2 {
3 Double IStrategy.DisCounts
4 {
5 get { return 1 ; }
6 }
7 }
View Code
1 public class Pad : Goods
2 {
3 protected override void Init()
4 {
5 Name = " Pad " ;
6 Price = 2600 ;
7 DisCountsStrategy = new OnePercentStrategy();
8 }
9 }
View Code
1 protected override void Init()
2 {
3 Name = " Phone " ;
4 Price = 4000 ;
5 DisCountsStrategy = new HalfPercentStrategy();
6 }
客户代码调用:
View Code
1 static void Main( string [] args)
2 {
3 IStore store = new GoodsStore( new GoodsFactory());
4 IEnumerator items = store.CreateGoods();
5 store.Print(items);
6 }
分类: 设计模式
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息