政策模式是一種行為模式。用于某一個具體的項目有多個可供選擇的算法政策,用戶端在其運作時根據不同需求決定使用某一具體算法政策。
本文例子是,完成一個簡單地購物車,兩種付款政策可供選擇,一為信用卡,另外一種為paypal。
首先建立政策接口,在本文例子中,付款金額作為參數。
<code>1</code>
<code>package</code> <code>com.journaldev.design.strategy;</code>
<code>2</code>
<code>3</code>
<code>public</code> <code>interface</code> <code>paymentstrategy {</code>
<code>4</code>
<code>5</code>
<code> </code><code>public</code> <code>void</code> <code>pay(</code><code>int</code> <code>amount);</code>
<code>6</code>
<code>}</code>
現在實作使用信用卡及paypal兩種算法政策的實體類。
<code>01</code>
<code>02</code>
<code>03</code>
<code>public</code> <code>class</code> <code>creditcardstrategy </code><code>implements</code> <code>paymentstrategy {</code>
<code>04</code>
<code>05</code>
<code> </code><code>private</code> <code>string name;</code>
<code>06</code>
<code> </code><code>private</code> <code>string cardnumber;</code>
<code>07</code>
<code> </code><code>private</code> <code>string cvv;</code>
<code>08</code>
<code> </code><code>private</code> <code>string dateofexpiry;</code>
<code>09</code>
<code>10</code>
<code> </code><code>public</code> <code>creditcardstrategy(string nm, string ccnum, string cvv, string expirydate){</code>
<code>11</code>
<code> </code><code>this</code><code>.name=nm;</code>
<code>12</code>
<code> </code><code>this</code><code>.cardnumber=ccnum;</code>
<code>13</code>
<code> </code><code>this</code><code>.cvv=cvv;</code>
<code>14</code>
<code> </code><code>this</code><code>.dateofexpiry=expirydate;</code>
<code>15</code>
<code> </code><code>}</code>
<code>16</code>
<code> </code><code>@override</code>
<code>17</code>
<code> </code><code>public</code> <code>void</code> <code>pay(</code><code>int</code> <code>amount) {</code>
<code>18</code>
<code> </code><code>system.out.println(amount +</code><code>" paid with credit/debit card"</code><code>);</code>
<code>19</code>
<code>20</code>
<code>21</code>
<code>public</code> <code>class</code> <code>paypalstrategy </code><code>implements</code> <code>paymentstrategy {</code>
<code> </code><code>private</code> <code>string emailid;</code>
<code> </code><code>private</code> <code>string password;</code>
<code> </code><code>public</code> <code>paypalstrategy(string email, string pwd){</code>
<code> </code><code>this</code><code>.emailid=email;</code>
<code> </code><code>this</code><code>.password=pwd;</code>
<code> </code><code>system.out.println(amount + </code><code>" paid using paypal."</code><code>);</code>
此時,算法政策已經準備就緒,現在需要實作購物車以及能夠運用付款政策的支付方法。
<code>public</code> <code>class</code> <code>item {</code>
<code> </code><code>private</code> <code>string upccode;</code>
<code> </code><code>private</code> <code>int</code> <code>price;</code>
<code> </code><code>public</code> <code>item(string upc, </code><code>int</code> <code>cost){</code>
<code> </code><code>this</code><code>.upccode=upc;</code>
<code> </code><code>this</code><code>.price=cost;</code>
<code> </code><code>public</code> <code>string getupccode() {</code>
<code> </code><code>return</code> <code>upccode;</code>
<code> </code><code>public</code> <code>int</code> <code>getprice() {</code>
<code> </code><code>return</code> <code>price;</code>
<code>import</code> <code>java.text.decimalformat;</code>
<code>import</code> <code>java.util.arraylist;</code>
<code>import</code> <code>java.util.list;</code>
<code>public</code> <code>class</code> <code>shoppingcart {</code>
<code> </code><code>//list of items</code>
<code> </code><code>list<item> items;</code>
<code> </code><code>public</code> <code>shoppingcart(){</code>
<code> </code><code>this</code><code>.items=</code><code>new</code> <code>arraylist<item>();</code>
<code> </code><code>public</code> <code>void</code> <code>additem(item item){</code>
<code> </code><code>this</code><code>.items.add(item);</code>
<code> </code><code>public</code> <code>void</code> <code>removeitem(item item){</code>
<code> </code><code>this</code><code>.items.remove(item);</code>
<code>22</code>
<code>23</code>
<code>24</code>
<code> </code><code>public</code> <code>int</code> <code>calculatetotal(){</code>
<code>25</code>
<code> </code><code>int</code> <code>sum = </code><code>0</code><code>;</code>
<code>26</code>
<code> </code><code>for</code><code>(item item : items){</code>
<code>27</code>
<code> </code><code>sum += item.getprice();</code>
<code>28</code>
<code> </code><code>}</code>
<code>29</code>
<code> </code><code>return</code> <code>sum;</code>
<code>30</code>
<code>31</code>
<code>32</code>
<code> </code><code>public</code> <code>void</code> <code>pay(paymentstrategy paymentmethod){</code>
<code>33</code>
<code> </code><code>int</code> <code>amount = calculatetotal();</code>
<code>34</code>
<code> </code><code>paymentmethod.pay(amount);</code>
<code>35</code>
<code>36</code>
注意,購物車的支付方法接受支付政策作為參數,但是不在其内部儲存任何執行個體變量。
一個簡單地測試程式。
<code>public</code> <code>class</code> <code>shoppingcarttest {</code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>main(string[] args) {</code>
<code> </code><code>shoppingcart cart = </code><code>new</code> <code>shoppingcart();</code>
<code> </code><code>item item1 = </code><code>new</code> <code>item(</code><code>"1234"</code><code>,</code><code>10</code><code>);</code>
<code> </code><code>item item2 = </code><code>new</code> <code>item(</code><code>"5678"</code><code>,</code><code>40</code><code>);</code>
<code> </code><code>cart.additem(item1);</code>
<code> </code><code>cart.additem(item2);</code>
<code> </code><code>//pay by paypal</code>
<code> </code><code>cart.pay(</code><code>new</code> <code>paypalstrategy(</code><code>"[email protected]"</code><code>, </code><code>"mypwd"</code><code>));</code>
<code> </code><code>//pay by credit card</code>
<code> </code><code>cart.pay(</code><code>new</code> <code>creditcardstrategy(</code><code>"pankaj kumar"</code><code>, </code><code>"1234567890123456"</code><code>, </code><code>"786"</code><code>, </code><code>"12/15"</code><code>));</code>
輸出如下:
<code>50</code> <code>paid using paypal.</code>
<code>50</code> <code>paid with credit/debit card</code>
政策模式uml圖
重要點:
* 此處可以建構政策的實體變量,但是應該盡量避免這種情況。因為需要保證對于特定的任務能夠對應某個具體的算法政策,與collection.sort()和array.sort()方法使用comparator作為參數道理類似。
* 政策模式類似與狀态模式。兩者之間的不同,狀态模式中的context(環境對象)包含了狀态的執行個體變量,并且不同的任務依賴同一個狀态。相反,在政策模式中政策是作為一個參數傳遞進方法中,context(環境對象)不需要也不能存儲任何變量。
* 當一組算法對應一個任務,并且程式可以在運作時靈活的選擇其中一個算法,政策模式是很好的選擇。
這就是全部的java政策模式,希望你喜歡上它了。