設計模式---策略模式

来源:https://www.cnblogs.com/miantiaoandrew/archive/2018/05/22/9073665.html
-Advertisement-
Play Games

下午學習了設計模式里的策略模式,寫個筆記,做個總結 策略模式的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] + ",");
        }
    }
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本篇博客的分頁插件是在2017-11-10 的一篇博客的基礎上改造的(原博客地址:原生js版分頁插件),主要是優化了分頁按鈕的排列和顯示樣式,取消首頁和末頁的箭頭按鈕,改為數字按鈕,並始終把它們分別固定放置在上一頁按鈕的後面和下一頁按鈕的前面。另外在DOM操作上,用的是jQuery,當然如果不想使用... ...
  • 什麼?這是要做前端的節奏嗎?只要公司有需要,我分分鐘變身、前端、美工、UI、交互、後端、資料庫管理員......快速學習、快速響應,快速適應。公司需要我幹啥,我就幹啥,而我存在於公司的意義就是利用所學的東西幫公司解決問題......事實上,如果讓一個人來搞定整個項目包括移動端、PC端等等,那你還不是 ...
  • 2018年5月4日,Angular6.0.0版正式發佈,新版本主要關註底層框架和工具鏈,目的在於使其變得更小更快。下麵就介紹下新版本的一些主要新特性,供大家參考。 ng update ng update 是新增的一個cli命令。通過ng update不僅可以保持正確的版本依賴,而且能保持依賴關係的同 ...
  • javascript和css文件中採用相對路徑,其基準路徑是完全不同的。 1.javascript引用資源(比如圖片)相對路徑是以宿主路徑(被引用的網頁比如你在首頁index.php引用了某js文件,則index.php即為宿主)所處位置為基準。 2.css引用資源(比如圖片)相對路徑是以.css文 ...
  • ...
  • 安裝 概念 在redux中分為3個對象:Action、Reducer、Store Action 1. 對行為(如用戶行為)的抽象 1. Action 就是一個普通 JavaScript 對象。如: (其中type欄位是約定也是必須的) 1. 作為Reducer的參數 Reducer 1. 一個普通的 ...
  • select下拉框選中的值,用jquery大家應該都會獲取, 如果select是多選的,也這麼獲取的話,則只能獲取到第一個選項的value值,但是有一個神奇的發現,如果是: 獲取text,則可以直接列印出選中的兩個選項的文本值的相連字元串,而不是只是第一個的text......... 獲取多選框的v ...
  • 1. vue-cli 簡介 Vue-cli 是 vue的設計者,為提升開發效率而提供的一個腳手架工具,可通過vue-cli快速構造項目結構 2. vue-cli 安裝步驟 安裝npm 或 cnpm 安裝webpack、webpack-cli 建議全局安裝一次: 建議全局安裝一次: 本地安裝一次: 本 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...