狀態模式
狀態機制 這一個在有很多同樣處理的單一介面
但有很多不同處理的邏輯時 , 非常好用的一個模式 , 也是我以前寫 Work Flow 流程時 一直
在尋找解決方案 , 但一直沒有這樣用的方式
那時還不曉得有這個方式可以用 , 這個模式可以把程式,切成一小塊一小塊的邏輯去處理
舉個例假設在寫一個遊戲 ,當 HP 減少到 2/1 時 應該做的邏輯 , 或減少到 3/1時應該做的邏輯
或遇到什麼怪物時做什麼事 , 這樣零零總總的事 , 我們不應該 if else 這樣去寫
因為這樣會讓程式之後不容易維護 , 也更難分工處理
狀態模式的解決方式是把程式分成一個個處理物件去處理
類似底下這樣的做法 , 可以一層層把邏輯給分散出去 , 進而導到
每個邏輯 , 就是一個單純的區塊管理
public class StateMachine {
/*
可以用來參考或共用的資料 , 在流程上會用到的
*/
public object personData{set;get;}
/*
用來存取狀態
*/
public HandleLogicState State{set; private get ;}
public void doWork(){
State.doWork(this);
}
}
狀態模型的本質 :根據狀態來分離和選擇行為
他的優點是 對於相依狀態的 if - else , 理論上來講可以用狀態模式來實現
那麼就可以把判斷移到處理類別中,從中減少if - else 避免巨大的條件判斷式
更進一步的分離狀態和行為 , 以及有更好的礦充性
我的網誌清單
2013年7月29日 星期一
2013年7月28日 星期日
Thread 應用 生產者 與 消費者模式
生產者 與 消費者 模式
這個模式在執行緒應用時是用來解決 大量資料需要被處理時 的一個機制
而這個機制通常是使用 Quene 來解決 , 因為 Quene 在多執行緒 存取資料時
遇到的瓶頸問題會較少
當生產者 產生待處理物件到一個資料量時
消費者有足夠的時間空間去處理時,會生產者那
那裡要資料處理,然後生產者的製造是一直持續不斷 , 這個模式的優點是 , 把生產及消費二條產線給分開處理,在程式設計上,變的更單純也更容易處錯
這個模式在執行緒應用時是用來解決 大量資料需要被處理時 的一個機制
而這個機制通常是使用 Quene 來解決 , 因為 Quene 在多執行緒 存取資料時
遇到的瓶頸問題會較少
當生產者 產生待處理物件到一個資料量時
消費者有足夠的時間空間去處理時,會生產者那
那裡要資料處理,然後生產者的製造是一直持續不斷 , 這個模式的優點是 , 把生產及消費二條產線給分開處理,在程式設計上,變的更單純也更容易處錯
2013年7月25日 星期四
C++ LIST 鏈結串列
這篇 原文連結
http://www.codeofhonor.com/blog/avoiding-game-crashes-related-to-linked-lists
這篇作者寫了一個 介入式雙向鏈結串列
之前我在寫 C++ 時我的鏈結管理都是用傳統資料結構的作法
寫一個
struct 然後用指標去關連 , 一層層接下去
http://www.codeofhonor.com/blog/avoiding-game-crashes-related-to-linked-lists
這篇作者寫了一個 介入式雙向鏈結串列
之前我在寫 C++ 時我的鏈結管理都是用傳統資料結構的作法
寫一個
struct 然後用指標去關連 , 一層層接下去
如圖所示,但這樣的話有幾個問題是,當你在移除時,效率就不會太好,你必需先找到那一個
然後再移除他,然後再把線給接回來
但原本這樣在資料數量不多時,其實影響的程度也不會有多大影響
不過這次因為我是要用在多執行緒的部份,
所以可能的情況下會有幾個行為會有影響
A緒行緒,一直加入物件
B執行緒,一直不斷循環物件做事情
C.執行緒.判斷事件做刪除物件
在這樣的情況下我剛好在尋找解決方案
這位作者寫的 List.h 可以解決我的這部份問題
第一他刪除物件時,鏈結不用再手動接回來,只要直接 delete 就可以
再來是他處理相關鏈結的方法有支援滿多的
比如
TestClass *gg = Tss.Head();
這樣就可以取得串列的開頭
employees.InsertTail(joe);
這樣就可以把串列加在最尾巴
delete honda;
刪除之後鏈結的關係不會中斷
2013年7月15日 星期一
C++ DLL 設計
最近因為需要用到 DLL 的部份 , 也因為之前我有用 OPENGL 寫過一套繪圖的 LIB
但因為沒有把他弄成 DLL 也一直想找時間把他再整理一次 , 所以這次思考了一下怎麼
設計 DLL , 當時在寫那套繪圖 LIB 時, 只是想找如何把東西做出來, 並沒有去思考如何
寫的更有架構 , 也因為當時只有我一人在做開發 , 但如果多人開發 , 那個東西會有問題
底下是我去找一些文章,然後整理過學到的東西
1.開放介面給使用者 , 然後提供一個入口 , 去實做這個物件再給使用者,
這個入口要請使用者傳入版本資訊 , 如果這個DLL 版本不對,就回傳失敗
這是給使用者的 .h 檔
class TESTDLL
{
public :
virtual int CALL ADD(int value) = 0;
};
extern "C"{ EXPORT TESTDLL* CALL TestCreate(int ver); }
2.然後我們在 TestCreate 的程式是
TESTDLL* CALL TestCreate(int ver)
{
/*這裡要判斷版本對不對*/
return (TESTDLL*) TESTDLL_Impl::_Interface_Get();
}
然後 _Interface_Get 再去產生我們實際的 DLL 物件
但因為沒有把他弄成 DLL 也一直想找時間把他再整理一次 , 所以這次思考了一下怎麼
設計 DLL , 當時在寫那套繪圖 LIB 時, 只是想找如何把東西做出來, 並沒有去思考如何
寫的更有架構 , 也因為當時只有我一人在做開發 , 但如果多人開發 , 那個東西會有問題
底下是我去找一些文章,然後整理過學到的東西
1.開放介面給使用者 , 然後提供一個入口 , 去實做這個物件再給使用者,
這個入口要請使用者傳入版本資訊 , 如果這個DLL 版本不對,就回傳失敗
這是給使用者的 .h 檔
class TESTDLL
{
public :
virtual int CALL ADD(int value) = 0;
};
extern "C"{ EXPORT TESTDLL* CALL TestCreate(int ver); }
2.然後我們在 TestCreate 的程式是
TESTDLL* CALL TestCreate(int ver)
{
/*這裡要判斷版本對不對*/
return (TESTDLL*) TESTDLL_Impl::_Interface_Get();
}
然後 _Interface_Get 再去產生我們實際的 DLL 物件
2013年7月11日 星期四
如何用程式解析寫一個四則運算?
如何用程式 寫一個 類似 4+5*6+4+(4*5)
去解析這樣的東西呢?
這個就需要一點巧思 , 其實我也有去參考一些文件及 看一些書才了解的
會想寫這個東西是因為,之前這個東西寫過好幾次,但寫過之後,又要再回想,然後好像腦袋沒有很顥像的畫面,想想乾脆把他寫出文章,之後記憶也比較深刻
首先需要幾個東西
1.取得解析字串
2.取得解析字串類型
類型有
運算式字符 "+-*/()="
數字 0~9 還有小數點
目前就這二個類型
首先流程是
A. 先開始解析字串 取得 是什麼類型 ,然後如果是數字 一開始也得到一組數字
B.
進入 + - 的運算 , 然後進入這個函式的一開時
再進入 * / 的函式 , 然後一樣進入 * / 的函式的一開始
再進入 判斷 開頭是否有 + 或 - 的運算式 , 比如 -5 * 4
然後再判斷是否有 "(" 開頭 , 如果有 再進入 判斷 +- 的函式
然後 +- 跟 */ 再進入判斷運算時 還要再往下一個運算走一次
也就是 比如
4+5*3
一開始我們 取得 4
然後進入 +- 判斷 再進入*/ 再進入判斷開頭是否有+- 然後再進入 判斷是否有 (
然後 接下來我們取得 +
然後再回到 判斷是否有 ( , 回到 開頭是否有 +- 回到 */ 但沒有
再回到 +- 有 , 這時 我們存下運算子 + , 再取得運算式 , 然後 我們又再一次進入 判斷是否有 */
然後 又再跑一次 剛剛的流程 , 重複 最後運算 , 得到結果
去解析這樣的東西呢?
這個就需要一點巧思 , 其實我也有去參考一些文件及 看一些書才了解的
會想寫這個東西是因為,之前這個東西寫過好幾次,但寫過之後,又要再回想,然後好像腦袋沒有很顥像的畫面,想想乾脆把他寫出文章,之後記憶也比較深刻
首先需要幾個東西
1.取得解析字串
2.取得解析字串類型
類型有
運算式字符 "+-*/()="
數字 0~9 還有小數點
目前就這二個類型
首先流程是
A. 先開始解析字串 取得 是什麼類型 ,然後如果是數字 一開始也得到一組數字
B.
進入 + - 的運算 , 然後進入這個函式的一開時
再進入 * / 的函式 , 然後一樣進入 * / 的函式的一開始
再進入 判斷 開頭是否有 + 或 - 的運算式 , 比如 -5 * 4
然後再判斷是否有 "(" 開頭 , 如果有 再進入 判斷 +- 的函式
然後 +- 跟 */ 再進入判斷運算時 還要再往下一個運算走一次
也就是 比如
4+5*3
一開始我們 取得 4
然後進入 +- 判斷 再進入*/ 再進入判斷開頭是否有+- 然後再進入 判斷是否有 (
然後 接下來我們取得 +
然後再回到 判斷是否有 ( , 回到 開頭是否有 +- 回到 */ 但沒有
再回到 +- 有 , 這時 我們存下運算子 + , 再取得運算式 , 然後 我們又再一次進入 判斷是否有 */
然後 又再跑一次 剛剛的流程 , 重複 最後運算 , 得到結果
2013年7月10日 星期三
遠端桌面的軟體的實現
有時我們想要自己寫一個遠端的監控程式 , 去監看對方的營幕時
我們該如何做呢?
之前有思考過這個問題 , 剛剛有稍微研究實現了一下我的想法
確實是可行的 , 我們可以截取桌面的畫面 , 截取下來之後 存在記憶體
再傳到遠方的客戶端 , 我有試過 , 大約 每二秒 或一秒 傳一次畫面
確實是順利的!!
如何用 C# 判斷程式是否當掉?
最近有一個需求,我寫的監控伺服器的程式
有時程式掛掉並不知道,所以必需寫一個程式來判斷
因為原本我就有寫程式監控記憶體,跟執行緒了
所以我只是在我原本的監控程式裡再加功能而己所以還算容易
這個程式必需增加二個功能 ( 我認為必需要有二個功能)
1.伺服器是否當掉了(在某個節點當住,導至無回應)
2.伺服器消失了
這個是我的主功能畫面
然後因為我有記錄執行檔名稱
//這裡是判斷伺服器是否當掉
Process[] check;
check= Process.GetProcessesByName(執行檔名稱);
if (check[0].Responding)
{
//代表程式還有回應
}
有時程式掛掉並不知道,所以必需寫一個程式來判斷
因為原本我就有寫程式監控記憶體,跟執行緒了
所以我只是在我原本的監控程式裡再加功能而己所以還算容易
這個程式必需增加二個功能 ( 我認為必需要有二個功能)
1.伺服器是否當掉了(在某個節點當住,導至無回應)
2.伺服器消失了
這個是我的主功能畫面
然後因為我有記錄執行檔名稱
//這裡是判斷伺服器是否當掉
Process[] check;
check= Process.GetProcessesByName(執行檔名稱);
if (check[0].Responding)
{
//代表程式還有回應
}
else
{//程式無回應
}
判斷伺服器是否消失也很簡單,就檢查 Process 裡是否有這隻執行檔存在就可以了
接下我會貼我的象棋麻將的 AI DEMO
訂閱:
意見 (Atom)






