策略模式(一)

来源:http://www.cnblogs.com/qily/archive/2017/09/29/7612184.html
-Advertisement-
Play Games

最近重看java編程思想,感覺收穫頗多。 看到在繼承處提到的策略模式不禁想到之前的一個乒乓球機器人的項目中的一個環節,感覺策略模式能很好的解決,所以在這裡寫一個小demo 情景: 由機器人視覺採集到一些點後,對乒乓求得軌跡進行預測,併在這條軌跡中取一個最佳擊球點。 之前我是直接在一個類中通過對不同方 ...


最近重看java編程思想,感覺收穫頗多。

看到在繼承處提到的策略模式不禁想到之前的一個乒乓球機器人的項目中的一個環節,感覺策略模式能很好的解決,所以在這裡寫一個小demo

情景:

  由機器人視覺採集到一些點後,對乒乓求得軌跡進行預測,併在這條軌跡中取一個最佳擊球點

  之前我是直接在一個類中通過對不同方案的比較返回一個值,但是寫到最後有7,8中方案的時候就會很混亂,此時可以考慮策略模式

策略模式本質

  通過什麼策略(strategy)對什麼樣的數據(input)進行處理最終得到什麼結果(返回值)

  函數原型:public Object process(Strategy A, Object input);

類圖:

 

關鍵:

  繼承(介面)

  向上轉型upcasting

 

代碼:

結構:

//FindHitPoint.java

1
package com.paci.base; 2 3 public class FindHitPoint { 4 5 public Object getHitPoint(Object[] points) { 6 // TODO Auto-generated method stub 7 return null; 8 } 9 }

 //App.java
 1 package com.paci.main;
 2 
 3 import com.paci.base.FindHitPoint;
 4 import com.paic.domain.Point3D;
 5 import com.paic.process.StrategyOne;
 6 import com.paic.process.StrategyTwo;
 7 
 8 public class App {
 9     public static void main(String[] args) {
10         Point3D[] trace = new Point3D[2];
11         trace[0] = new Point3D(0, 0, 0);
12         trace[1] = new Point3D(1, 1, 1);
13         Point3D result = (Point3D) getResult(new StrategyOne(), trace);
14         System.out.println(result.getX() + "@" + result.getY() + "@" + result.getZ());
15     }
16     
17     private static Object getResult(FindHitPoint fhp, Object[] input) {
18         Object obj = null;
19         obj = fhp.getHitPoint(input);
20         return obj;
21     }
22 }
 //Point3D.java

1
package com.paic.domain; 2 3 public class Point3D { 4 private float x; 5 private float y; 6 private float z; 7 8 public Point3D(float x, float y, float z){ 9 this.x = x; 10 this.y = y; 11 this.z = z; 12 } 13 14 public float getX() { 15 return x; 16 } 17 public void setX(float x) { 18 this.x = x; 19 } 20 public float getY() { 21 return y; 22 } 23 public void setY(float y) { 24 this.y = y; 25 } 26 public float getZ() { 27 return z; 28 } 29 public void setZ(float z) { 30 this.z = z; 31 } 32 33 }
 
//StrategyOne.java

1
package com.paic.process; 2 3 import com.paci.base.FindHitPoint; 4 import com.paic.domain.Point3D; 5 6 public class StrategyOne extends FindHitPoint { 7 8 @Override 9 public Object getHitPoint(Object[] points) { 10 11 Point3D hitPoint = null; 12 if(points != null) { 13 hitPoint = (Point3D)points[0]; 14 } 15 return hitPoint; 16 } 17 18 }

//StrategyTwo.java


1
package com.paic.process; 2 3 import com.paci.base.FindHitPoint; 4 import com.paic.domain.Point3D; 5 6 public class StrategyTwo extends FindHitPoint { 7 8 @Override 9 public Object getHitPoint(Object[] points) { 10 11 Point3D hitPoint = null; 12 if(points != null) { 13 hitPoint = (Point3D)points[1]; 14 } 15 return hitPoint; 16 } 17 }

 


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

-Advertisement-
Play Games
更多相關文章
  • Buy Tickets Problem Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get up early and join a long queu ...
  • 關於裝飾器的更多信息可以參考http://egon09.blog.51cto.com/9161406/1836763 1.裝飾器Decorator裝飾器:本質上是函數,(裝飾其他函數),就是為其他函數添加附加功能 原則:不能修改被裝飾函數的源代碼;不能修改被裝飾函數的調用方式#實現裝飾器的知識儲備:... ...
  • 歷經千辛萬苦,整理了軟體開發過程中必備英文單詞,助你走向編程巔峰 !!! 連最難的英文單詞你都征服了,你還怕什麼? (拒絕死記硬背,平時多看看,多用於代碼中,) 【不求全部都會,但求蒙的都對!】 第一天 application [ˌæplɪ'keɪʃ(ə)n]應用程式 應用、應用程式 applica ...
  • 當前環境 代碼地址 git 地址:https://github.com/jasonGeng88/java-network-programming 背景 前不久,上線了一個新項目,這個項目是一個壓測系統,可以簡單的看做通過回放詞表(http請求數據),不斷地向服務發送請求,以達到壓測服務的目的。在測試 ...
  • 【卻說那妖精與大聖鬥經半日,不分勝敗。行者把棒丟起,叫一聲“變!”就以一變十,以十變百,以百變千,半天里,好似蛇游蟒攪,亂打妖邪。妖邪慌了手腳,將身一閃,化道清風,即奔碧空之上逃走。行者念聲咒語,將鐵棒收做一根,縱祥光一直趕來。】 在西游記第九十五回【假合真形擒玉兔 真陰歸正會靈元】中,孫行者“毆打 ...
  • 1.3 網路編程模型與服務治理 服務治理和服務劃分密不可分。服務之間既然進行了劃分,那麼服務之間就要進行通信。當今服務整個鏈路中最耗時的不是鏈路節點本身,而是節點間的通信。理解網路編程模型可以更好的進行服務治理。 網路編程模型的選擇與服務治理關心的性能指標,各種參數的配置,維護的上下游之間是怎樣的關 ...
  • 1.uml活動圖 活動圖是uml用來對系統動態行為建模的另一種建模方法。描述活動的順序,展現活動從一個活動到另一個活動的流程。活動圖的本質是流程圖。 2.活動圖的繪製 2.1 活動圖的基本模型 活動圖的組成元素:活動,轉換,分支,合併,分叉,匯合,泳道。 如圖:一個簡單的活動圖。 2.2活動的表示 ...
  • 前臺: 支持三套模版, 可以在後臺切換 系統介紹: 1.網站後臺採用主流的 SSM 框架 jsp JSTL,網站後臺採用freemaker靜態化模版引擎生成html 2.因為是生成的html,所以訪問速度快,輕便,對伺服器負擔小 3.網站前端採用主流的響應式佈局,同一頁面同時支持PC、平板、手機(三 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...