今天翻到了伍迷前輩的大話設計模式中的《第二章 商場促銷-策略模式》。我感覺用WF去實現,比較簡單直觀,我很喜歡做簡單的事情 。故使用了伍迷前輩書中的兩個主要人物小菜和大鳥,寫下這篇博客。
時間:4月16日 地點:大鳥的房間 人物:大鳥、小菜
大鳥給小菜出了一個題目,做一個收銀軟件。小菜用WF4不到二十分鐘寫出了第一個版本,功能也非常的簡單,如下:
定義一個ProductItem類和Order類,如下:
1 public class ProductItem
2 {
3 public decimal ProductPrice
4 {
5 get;
6 set;
7 }
8 public int ProductNumber
9 {
10 get;
11 set;
12 }
13 public string ProductName
14 {
15 get;
16 set;
17 }
18
19 }
20
21 public class Order
22 {
23 public Order()
24 {
25 ProductList = new List<ProductItem> ();
26 }
27 public List<ProductItem> ProductList
28 {
29 get;
30 set;
31 }
32 }
設置處理流程:
實例測試:
1 Order myOrder = new Order();
2 ProductItem item1 = new ProductItem();
3 item1.ProductName = "蘋果";
4 item1.ProductPrice = 5;
5 item1.ProductNumber = 2;
6 myOrder.ProductList.Add(item1);
7
8 ProductItem item2 = new ProductItem();
9 item1.ProductName = "外套";
10 item1.ProductPrice = 200;
11 item1.ProductNumber = 1;
12 myOrder.ProductList.Add(item2);
13 // create dictionary with input arguments for the workflow
14 IDictionary<string, object> input = new Dictionary<string, object>
15 {
16 { "Order" , myOrder }
17 };
18
19 // execute the workflow
20 IDictionary<string, object> output
21 = WorkflowInvoker.Invoke(new CashRegister2(), input);
22
23 // Get the TotalAmount returned by the workflow
24 decimal total = (decimal)output["totalPrices"];
25
26 Console.WriteLine("工作流返回的總金額 為:"+total.ToString());
27 Console.Read();
運行結果:
大鳥看了之後,說如果我要增加一個全部產品打8折的功能,你去修改一下。
小鳥思考片刻,在流程上加上一個打折的變量:
修改流程,加入如下節點:
大鳥看了之後,說我要八折、七折、五折、滿300送100、滿200送50...,你再去修改一下
小菜思考片刻後,在類Order中加入一個屬性,如下:
1 public string CashMethod
2 {
3 get;
4 set;
5 }
在流程中加入一個同名的輸入參數:CashMethod,如下。
修改流程,添加一個switch活動用於判斷:
使用:
1 Order myOrder = new Order();
2 ProductItem item1 = new ProductItem ();
3 item1.ProductName = "蘋果";
4 item1.ProductPrice = 5;
5 item1.ProductNumber = 2;
6 myOrder.ProductList.Add (item1);
7
8 ProductItem item2 = new ProductItem();
9 item2.ProductName = "外套";
10 item2.ProductPrice = 200;
11 item2.ProductNumber = 1;
12 myOrder.ProductList.Add(item2);
13 myOrder.CashMethod = "滿200返回50";
14 // create dictionary with input arguments for the workflow
15 IDictionary<string, object> input = new Dictionary<string, object>
16 {
17 { "Order" , myOrder }
18 };
19
20 // execute the workflow
21 IDictionary<string, object> output
22 = WorkflowInvoker.Invoke(new CashRegister3(), input);
23
24 // Get the TotalAmount returned by the workflow
25 decimal total = (decimal)output["totalPrices"];
26
27 Console.WriteLine("工作流返回的總金額為:"+total.ToString());
28 Console.Read ();
得到如下輸出的結果:
小鳥說:“現在,無論你如何改需求,我只要用WF4.0設計器,手動簡單地拖拉控件定制流程,再稍稍調整一下代碼,就OK了,呵呵。”
大鳥好好表揚了一番小鳥。連說“不錯,不錯”。
總結:
這篇文章體現了WF一個很大的優點,就是用戶能夠定制化。文章可以擴展一個形象的流程設計器,這樣用戶就可以隨便修改自己超市的 收銀規則了。
本文配套源碼