設計模式漫談之解釋器模式

来源:https://www.cnblogs.com/wang-charle/archive/2018/05/01/8976756.html
-Advertisement-
Play Games

今天5月1號了,回鄭州,在家待了三天。打了幾天手游,花了不少錢。家裡準備再蓋座房子,我也應該為家裡做些貢獻。真他娘累,30多了,單身,現在已有些恐婚了。近期有空要做個記賬軟體,否則錢花的太快了。這個月,20多號還要軟考,我這應該是考不過了,基本放棄了。老闆原說漲3K,又變成2K,坑,套路。 近期我寫 ...


今天5月1號了,回鄭州,在家待了三天。打了幾天手游,花了不少錢。家裡準備再蓋座房子,我也應該為家裡做些貢獻。真他娘累,30多了,單身,現在已有些恐婚了。近期有空要做個記賬軟體,否則錢花的太快了。這個月,20多號還要軟考,我這應該是考不過了,基本放棄了。老闆原說漲3K,又變成2K,坑,套路。

近期我寫的代碼有上層到github和csdn code中,這種托管代碼平臺絕對是程式員的福利。

閑話少扯,繼續說設計模式,從今天起就開始說行為模式。剛看到C#版本都更新到8.0了,讓我意識到,編程思想很重要,否則做程式員絕對累。思想上的東西就是內功,內功屌打出來的普通招式也牛13.

寫代碼的時候不要刻意用設計模式,用編程思想是根本。像面向對象的語言C#,設計的時候可以從兩個方面入手,抽象方面=》具體;核心代碼=》封裝。原則就是易擴展,易維護,高內聚低耦合。

類型從數量上分,可以是兩種,表示單個數的類型,表示多個數的類型。

抽象的,介面,所有不具體的,只能做引用,不能創造對象。在面向對象中所有對象必須有宿主。

編程界四大神器,編譯器,解釋器,鏈接器,調試器。把一種表現形式解釋成另一種表現形式。

說起來繞,直接上代碼。我來解釋說明。

//包裝屬性的宿主類

class PlayContext
{

private string text;
public string PlayText
{
get { return text; }
set { text = value; }
}
}

//抽象概念上就是對內容進行解釋。

abstract class Expression
{

public void Interpret(PlayContext context)
{
if (context.PlayText.Length == 0)
{
return;
}
else
{
string playKey = context.PlayText.Substring(0, 1);
context.PlayText = context.PlayText.Substring(2);
double playValue = Convert.ToDouble(context.PlayText.Substring(0, context.PlayText.IndexOf(" ")));
context.PlayText = context.PlayText.Substring(context.PlayText.IndexOf(" ") + 1);

Excute(playKey, playValue);

}
}
//不同的具體解釋內容
public abstract void Excute(string key, double value);
}

//具體的解釋內容

class Note : Expression
{
public override void Excute(string key, double value)
{
string note = "";
switch (key)
{
case "C":
note = "1";
break;
case "D":
note = "2";
break;
case "E":
note = "3";
break;
case "F":
note = "4";
break;
case "G":
note = "5";
break;
case "A":
note = "6";
break;
case "B":
note = "7";
break;

}
Console.Write("{0} ", note);
}
}

//不同的解釋內容

class Scale : Expression
{
public override void Excute(string key, double value)
{
string scale = "";
switch (Convert.ToInt32(value))
{
case 1:
scale = "低音";
break;
case 2:
scale = "中音";
break;
case 3:
scale = "高音";
break;

}
Console.Write("{0} ", scale);
}
}

//對不同的情況進行解釋

PlayContext context = new PlayContext();

Console.WriteLine("上海灘:");
//context.演奏文本 = "T 500 O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 D 0.5 E 0.5 G 3 D 0.5 E 0.5 O 1 A 3 A 0.5 O 2 C 0.5 D 1.5 E 0.5 D 0.5 O 1 B 0.5 A 0.5 O 2 C 0.5 O 1 G 3 P 0.5 O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 D 0.5 E 0.5 G 3 D 0.5 E 0.5 O 1 A 3 A 0.5 O 2 C 0.5 D 1.5 E 0.5 D 0.5 O 1 B 0.5 A 0.5 G 0.5 O 2 C 3 P 0.5 O 3 C 0.5 C 0.5 O 2 A 0.5 O 3 C 2 P 0.5 O 2 A 0.5 O 3 C 0.5 O 2 A 0.5 G 2.5 G 0.5 E 0.5 A 1.5 G 0.5 C 1 D 0.25 C 0.25 D 0.5 E 2.5 E 0.5 E 0.5 D 0.5 E 2.5 O 3 C 0.5 C 0.5 O 2 B 0.5 A 3 E 0.5 E 0.5 D 1.5 E 0.5 O 3 C 0.5 O 2 B 0.5 A 0.5 E 0.5 G 2 P 0.5 O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 D 0.5 E 0.5 G 3 D 0.5 E 0.5 O 1 A 3 A 0.5 O 2 C 0.5 D 1.5 E 0.5 D 0.5 O 1 B 0.5 A 0.5 G 0.5 O 2 C 3 ";
context.PlayText = "T 500 O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 ";

//Console.WriteLine("隱形的翅膀:");
//context.演奏文本 = "T 1000 O 1 G 0.5 O 2 C 0.5 E 1.5 G 0.5 E 1 D 0.5 C 0.5 C 0.5 C 0.5 C 0.5 O 1 A 0.25 G 0.25 G 1 G 0.5 O 2 C 0.5 E 1.5 G 0.5 G 0.5 G 0.5 A 0.5 G 0.5 G 0.5 D 0.25 E 0.25 D 0.5 C 0.25 D 0.25 D 1 A 0.5 G 0.5 E 1.5 G 0.5 G 0.5 G 0.5 A 0.5 G 0.5 E 0.5 D 0.5 C 0.5 C 0.25 D 0.25 O 1 A 1 G 0.5 A 0.5 O 2 C 1.5 D 0.25 E 0.25 D 1 E 0.5 C 0.5 C 3 O 1 G 0.5 O 2 C 0.5 E 1.5 G 0.5 E 1 D 0.5 C 0.5 C 0.5 C 0.5 C 0.5 O 1 A 0.25 G 0.25 G 1 G 0.5 O 2 C 0.5 E 1.5 G 0.5 G 0.5 G 0.5 A 0.5 G 0.5 G 0.5 D 0.25 E 0.25 D 0.5 C 0.25 D 0.25 D 1 A 0.5 G 0.5 E 1.5 G 0.5 G 0.5 G 0.5 A 0.5 G 0.5 E 0.5 D 0.5 C 0.5 C 0.25 D 0.25 O 1 A 1 G 0.5 A 0.5 O 2 C 1.5 D 0.25 E 0.25 D 1 E 0.5 C 0.5 C 3 E 0.5 G 0.5 O 3 C 1.5 O 2 B 0.25 O 3 C 0.25 O 2 B 1 A 0.5 G 0.5 A 0.5 O 3 C 0.5 O 2 E 0.5 D 0.5 C 1 C 0.5 C 0.5 C 0.5 O 3 C 1 O 2 G 0.25 A 0.25 G 0.5 D 0.25 E 0.25 D 0.5 C 0.25 D 0.25 D 3 E 0.5 G 0.5 O 3 C 1.5 O 2 B 0.25 O 3 C 0.25 O 2 B 1 A 0.5 G 0.5 A 0.5 O 3 C 0.5 O 2 E 0.5 D 0.5 C 1 C 0.5 C 0.5 C 0.5 O 3 C 1 O 2 G 0.25 A 0.25 G 0.5 D 0.25 E 0.25 D 0.5 C 0.5 C 3 ";
Expression expression = null;
try
{
while (context.PlayText.Length > 0)
{
string str = context.PlayText.Substring(0, 1);
switch (str)
{
case "O":
expression = new Scale();
break;
case "T":
expression = new Speed();
break;
case "C":
case "D":
case "E":
case "F":
case "G":
case "A":
case "B":
case "P":
expression = new Note();
break;

}

//分不同情況操作同一個實例
expression.Interpret(context);

}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}

Console.Read();

 

總結:解釋模式就是對一種表現形式的另一種解釋。使用設計模式的目的就是為了易擴展易維護,也正是因為面向對象中有抽象與具體分開的繼承,實現的機制。

程式員最寶貴的是編程思想,不扯了,現在心有點不靜,到此為止吧,大家多多包涵。


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

-Advertisement-
Play Games
更多相關文章
  • 本文內容: 層疊性 繼承性 優先順序 權重計算方法(特異性) 首發日期:2018-05-01 層疊性: 層疊性是指當一個標簽被設置了多個重覆的樣式的時候,一個屬性會覆蓋另外一個屬性。 比如:先給div設置背景顏色為紅色,然後設置背景顏色為粉紅色,那麼最終顏色可能為紅色,也可能為粉紅色(明顯的兩種顏色設... ...
  • 三維變換使用基於二維變換的相同屬性。3D變換功能與2D變換功能相當類似,css3中3D變換主要有4個功能函數: 1、3D位移:CSS3中的3D位移主要包括translateZ()和translate3d()兩個功能函數。 2、3D旋轉:CSS3中的3D旋轉主要包括rotateX(),rotateY( ...
  • 一、JS的變數 1.變數的聲明 2.使用一行代碼強調多個語句。其中b為undefined; 3.JS中變數聲明的註意事項。 ①JS中聲明變數的關鍵字只有var一個,變數的類型取決於所附的值。 如果聲明時未賦值,則返回undefined類型(聲明之後沒有賦值的變數,不是未聲明)。②JS中同一個變數,可 ...
  • 元素(element) 類型:替換和非替換元素 替換元素(replaced element): 用來替換元素內容的部分並非由文檔內容直接顯示. eg:img input 非替換元素(nonreplaced element): 其內容由用戶代理在元素本身生成的框顯示. eg:絕大多數都是非替換元素 基 ...
  • 前端技術之_CSS詳解第一天 一html部分 略。。。。 二、列表 列表有3種 2.1 無序列表 無序列表,用來表示一個列表的語義,並且每個項目和每個項目之間,是不分先後的。 ul就是英語unordered list,“無序列表”的意思。 li 就是英語list item , “列表項”的意思。 你 ...
  • transform轉換屬性的5個值: 1、 translate(x值,y值) 移動效果。 2、rotate(45deg) 旋轉效果。 3、scale(x軸倍數,y軸倍數) 縮放效果。 4、skew(x軸deg,y軸deg) 傾斜效果。 5、matrix() 矩陣 ...
  • 面向對象第八次作業 代碼分析 第五次作業 多線程電梯 UML圖和協作圖 代碼複雜度分析 這次作業的主要難點在於對於多線程的理解和實踐,一方面由於老師上課講的著急,內容也更多的偏向JVM的介紹,因此對於多線程編程的一些思路和方法沒有多少瞭解,另一方面由於時間不足也沒有時間去更詳細的自學多線程,因此基本 ...
  • 前言 在最近一個月的面向對象編程學習中,我們進入了編寫多線程程式的階段。線程的創建、調度和信息傳遞,共用對象的處理,線程安全類的編寫,各種有關於線程的操作在一定程度上增加了近三次作業的複雜度與難度,帶來了不小的考驗。本文通過分析總結近三次作業的完成情況,分享我對與多線程編程的一些見解與體會。 作業總 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...