<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 算法的封裝與切換——策略模式(三) 24.3 完整解決方案 為了實現打折算法的復用,并能夠靈活地向系統中增加新的打折方式,Sunny軟件公司開發人員使用策略模式對電影院打折方案進行重構,重構后基本結構如圖24-2所示: ![](http://my.csdn.net/uploads/201208/01/1343811809_8784.jpg) 在圖24-2中,MovieTicket充當環境類角色,Discount充當抽象策略角色,StudentDiscount、 ChildrenDiscount 和VIPDiscount充當具體策略角色。完整代碼如下所示: ``` //電影票類:環境類 class MovieTicket { private double price; private Discount discount; //維持一個對抽象折扣類的引用 public void setPrice(double price) { this.price = price; } //注入一個折扣類對象 public void setDiscount(Discount discount) { this.discount = discount; } public double getPrice() { //調用折扣類的折扣價計算方法 return discount.calculate(this.price); } } //折扣類:抽象策略類 interface Discount { public double calculate(double price); } //學生票折扣類:具體策略類 class StudentDiscount implements Discount { public double calculate(double price) { System.out.println("學生票:"); return price * 0.8; } } //兒童票折扣類:具體策略類 class ChildrenDiscount implements Discount { public double calculate(double price) { System.out.println("兒童票:"); return price - 10; } } //VIP會員票折扣類:具體策略類 class VIPDiscount implements Discount { public double calculate(double price) { System.out.println("VIP票:"); System.out.println("增加積分!"); return price * 0.5; } } ``` 為了提高系統的靈活性和可擴展性,我們將具體策略類的類名存儲在配置文件中,并通過工具類XMLUtil來讀取配置文件并反射生成對象,XMLUtil類的代碼如下所示: ``` import javax.xml.parsers.*; import org.w3c.dom.*; import org.xml.sax.SAXException; import java.io.*; class XMLUtil { //該方法用于從XML配置文件中提取具體類類名,并返回一個實例對象 public static Object getBean() { try { //創建文檔對象 DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dFactory.newDocumentBuilder(); Document doc; doc = builder.parse(new File("config.xml")); //獲取包含類名的文本節點 NodeList nl = doc.getElementsByTagName("className"); Node classNode=nl.item(0).getFirstChild(); String cName=classNode.getNodeValue(); //通過類名生成實例對象并將其返回 Class c=Class.forName(cName); Object obj=c.newInstance(); return obj; } catch(Exception e) { e.printStackTrace(); return null; } } } ``` 在配置文件config.xml中存儲了具體策略類的類名,代碼如下所示: ``` <?xml version="1.0"?> <config> <className>StudentDiscount</className> </config> ``` 編寫如下客戶端測試代碼: ``` class Client { public static void main(String args[]) { MovieTicket mt = new MovieTicket(); double originalPrice = 60.0; double currentPrice; mt.setPrice(originalPrice); System.out.println("原始價為:" + originalPrice); System.out.println("---------------------------------"); Discount discount; discount = (Discount)XMLUtil.getBean(); //讀取配置文件并反射生成具體折扣對象 mt.setDiscount(discount); //注入折扣對象 currentPrice = mt.getPrice(); System.out.println("折后價為:" + currentPrice); } } ``` 編譯并運行程序,輸出結果如下: ``` 原始價為:60.0 --------------------------------- 學生票: 折后價為:48.0 ``` 如果需要更換具體策略類,無須修改源代碼,只需修改配置文件,例如將學生票改為兒童票,只需將存儲在配置文件中的具體策略類StudentDiscount改為ChildrenDiscount,如下代碼所示: ``` <?xml version="1.0"?> <config> <className>ChildrenDiscount</className> </config> ``` 重新運行客戶端程序,輸出結果如下: ``` 原始價為:60.0 --------------------------------- 兒童票: 折后價為:50.0 ``` 如果需要增加新的打折方式,原有代碼均無須修改,只要增加一個新的折扣類作為抽象折扣類的子類,實現在抽象折扣類中聲明的打折方法,然后修改配置文件,將原有具體折扣類類名改為新增折扣類類名即可,完全符合“開閉原則”。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看