天天看點

Java中的政策模式執行個體教程

政策模式是一種行為模式。用于某一個具體的項目有多個可供選擇的算法政策,用戶端在其運作時根據不同需求決定使用某一具體算法政策。

本文例子是,完成一個簡單地購物車,兩種付款政策可供選擇,一為信用卡,另外一種為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&lt;item&gt; items;</code>

<code>    </code><code>public</code> <code>shoppingcart(){</code>

<code>        </code><code>this</code><code>.items=</code><code>new</code> <code>arraylist&lt;item&gt;();</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圖

Java中的政策模式執行個體教程

重要點:

*  此處可以建構政策的實體變量,但是應該盡量避免這種情況。因為需要保證對于特定的任務能夠對應某個具體的算法政策,與collection.sort()和array.sort()方法使用comparator作為參數道理類似。

*  政策模式類似與狀态模式。兩者之間的不同,狀态模式中的context(環境對象)包含了狀态的執行個體變量,并且不同的任務依賴同一個狀态。相反,在政策模式中政策是作為一個參數傳遞進方法中,context(環境對象)不需要也不能存儲任何變量。

*  當一組算法對應一個任務,并且程式可以在運作時靈活的選擇其中一個算法,政策模式是很好的選擇。

這就是全部的java政策模式,希望你喜歡上它了。