下午學習了設計模式里的策略模式,寫個筆記,做個總結 策略模式的UML圖為: 舉個例子: 我們每個人都想走向人生巔峰,但是怎麼走向人生巔峰呢??有三個方法:1、當總經理;2、出任CEO;3、娶白富美。正好我身邊有三個小伙伴,他們就想通過這三種策略來走向人生巔峰。。。 首先是走向人生巔峰的策略介面 然後 ...
下午學習了設計模式里的策略模式,寫個筆記,做個總結
策略模式的UML圖為:
舉個例子:
我們每個人都想走向人生巔峰,但是怎麼走向人生巔峰呢??有三個方法:1、當總經理;2、出任CEO;3、娶白富美。正好我身邊有三個小伙伴,他們就想通過這三種策略來走向人生巔峰。。。
首先是走向人生巔峰的策略介面
package com.designmodel.strategy; /** * 走向人生巔峰的策略介面 * */ public interface IStrategy { void operate(); }
然後是三種走向人生巔峰的策略,三種策略都實現這個介面
策略一:當總經理
package com.designmodel.strategy; /** * 策略一 當個總經理 * */ public class BeGeneralManagerStrategy implements IStrategy { @Override public void operate() { System.out.println("當總經理"); } }
策略二:出任CEO
package com.designmodel.strategy; /** * 策略二 出任CEO * */ public class BeCEOStrategy implements IStrategy { @Override public void operate() { System.out.println("出任CEO"); } }
策略三:娶白富美
package com.designmodel.strategy; /** * 策略三 娶個白富美 * @author Administrator * */ public class MarryWithRichStategy implements IStrategy { @Override public void operate() { System.out.println("娶白富美"); } }
最後,有個執行這些策略的環境
package com.designmodel.strategy; /** * 執行策略的環境 * */ public class Context { private IStrategy strategy; public Context(IStrategy strategy) { this.strategy = strategy; } public void operate() { strategy.operate(); } }
好了,這些都具備了,策略模式也就展現出來了。現在我的三個小伙伴,錢同學想通過當CEO走向人生巔峰,李同學想通過當總經理走向人生巔峰,張同學只想癩蛤蟆吃天鵝肉,娶白富美走向人生巔峰
package com.designmodel.strategy; public class MainApp { public static void main(String[] args) { // 錢同學的願望是出任CEO, 從而走向人生巔峰 // 錢同學的策略是... BeCEOStrategy qianStrategy = new BeCEOStrategy(); // 所以錢同學的策略環境是... Context qianContext = new Context(qianStrategy); // 在該環境下執行策略... System.out.print("錢同學走向人生巔峰的方法是:"); qianContext.operate(); // 李同學不想出任CEO, 就當個總經理就滿足了, 因此... BeGeneralManagerStrategy liStrategy = new BeGeneralManagerStrategy(); Context liContext = new Context(liStrategy); System.out.print("李同學走向人生巔峰的方法是:"); liContext.operate(); // 張同學是癩蛤蟆想吃天鵝肉, 打算傍個白富美走向人生巔峰, 所以... MarryWithRichStategy zhangStrategy = new MarryWithRichStategy(); Context zhangContext = new Context(zhangStrategy); System.out.print("張同學走向人生巔峰的方法是:"); zhangContext.operate(); } }
執行結果為:
錢同學走向人生巔峰的方法是:出任CEO
李同學走向人生巔峰的方法是:當總經理
張同學走向人生巔峰的方法是:娶白富美
再舉一個例子,通常的排序演算法有四種,插入排序,冒泡排序,快速排序和選擇排序,這也就是對應著4種策略。
排序介面:
package com.designmodel.strategy; public interface Sort { public abstract int[] sort(int arr[]); }
四個排序策略:
1.插入排序
package com.designmodel.strategy; public class InsertionSort implements Sort { @Override public int[] sort(int[] arr) { int len=arr.length; for(int i=1;i<len;i++) { int j; int temp=arr[i]; for(j=i;j>0;j--) { if(arr[j-1]>temp) { arr[j]=arr[j-1]; }else break; } arr[j]=temp; } System.out.println("插入排序"); return arr; } }
2.冒泡排序
package com.designmodel.strategy; public class BubbleSort implements Sort { @Override public int[] sort(int[] arr) { int len=arr.length; for(int i=0;i<len;i++) { for(int j=i+1;j<len;j++) { int temp; if(arr[i]>arr[j]) { temp=arr[j]; arr[j]=arr[i]; arr[i]=temp; } } } System.out.println("冒泡排序"); return arr; } }
3.快速排序
package com.designmodel.strategy; public class QuickSort implements Sort { @Override public int[] sort(int[] arr) { System.out.println("快速排序"); sort(arr,0,arr.length-1); return arr; } public void sort(int arr[],int p, int r) { int q=0; if(p<r) { q=partition(arr,p,r); sort(arr,p,q-1); sort(arr,q+1,r); } } public int partition(int[] a, int p, int r) { int x=a[r]; int j=p-1; for(int i=p;i<=r-1;i++) { if(a[i]<=x) { j++; swap(a,j,i); } } swap(a,j+1,r); return j+1; } public void swap(int[] a, int i, int j) { int t = a[i]; a[i] = a[j]; a[j] = t; } }
4.選擇排序
package com.designmodel.strategy; public class SelectionSort implements Sort { @Override public int[] sort(int[] arr) { int len=arr.length; int temp; for(int i=0;i<len;i++) { temp=arr[i]; int j; int samllestLocation=i; for(j=i+1;j<len;j++) { if(arr[j]<temp) { temp=arr[j]; samllestLocation=j; } } arr[samllestLocation]=arr[i]; arr[i]=temp; } System.out.println("選擇排序"); return arr; } }
讀取XML配置文件工具類
package com.designmodel.strategy; import javax.xml.parsers.*; import org.w3c.dom.*; import java.io.*; public 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; } } }
配置文件
<?xml version="1.0" encoding="UTF-8"?> <config> <className>QuickSort</className> </config>
還有執行策略的環境
package com.designmodel.strategy; public class ArrayHandler { private Sort sortObj; public int[] sort(int arr[]) { sortObj.sort(arr); return arr; } public void setSortObj(Sort sortObj) { this.sortObj = sortObj; } }
最後是main函數
package com.designmodel.strategy; public class Client { public static void main(String[] args) { int arr[]={1,4,6,2,5,3,7,10,9}; int result[]; ArrayHandler ah=new ArrayHandler(); Sort sort; sort=(Sort)XMLUtil.getBean(); ah.setSortObj(sort); //設置具體策略 result=ah.sort(arr); for(int i=0;i<result.length;i++) { System.out.print(result[i] + ","); } } }