1. 程式人生 > >遊戲中的設計模式五(策略模式)

遊戲中的設計模式五(策略模式)

部落格地址:blog.liujunliang.com.cn

寫在前面

在遊戲中計算各個覺得的攻擊值、防禦值時,由於各個角色的職業不同,攻擊值和防禦值計算演算法就會不一樣

通常使用if....else語句來抉擇不同型別之間的演算法將帶來程式複雜和難以維持,當有新的演算法或行為時違背開閉原則

策略模式是對演算法的包裝,是把使用演算法的責任和演算法本身分割開來。委託給不同的物件管理。

模式角色

環境類:對策略進行二次封裝,目的是避免高層模組對策略的直接呼叫

抽象策略:這是一個抽象角色,通常由一個介面或抽象類實現,其提供所有具體策略類所需要的介面

具體策略:包裝相關的演算法或行為

模式結構圖


程式碼案例

定義一個抽象類(抽象策略)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public abstract class IStrategy 
{
	public abstract int GetAttackValue();
	public abstract int GetDefenseValue();
}


 建立實現介面的實體類(具體策略)

戰士

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class WarriorStrategy : IStrategy
{
	public override int GetAttackValue()
	{
		Debug.Log("得到戰士攻擊值");
		return 0;
	}

	public override int GetDefenseValue()
	{
		Debug.Log("得到戰士防禦值");
		return 0;
	}

}


法師

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MasterStrategy : IStrategy
{
	public override int GetAttackValue()
	{
		Debug.Log("得到法師攻擊值");
		return 0;
	}

	public override int GetDefenseValue()
	{
		Debug.Log("得到法師防禦值");
		return 0;
	}
}


建立環境類

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Context
{
	private IStrategy strategy;

	public Context(IStrategy strategy)
	{
		this.strategy = strategy;
	}

	public void SetStrategy(IStrategy strategy)
	{
		this.strategy = strategy;
	}

	public int GetAttackValue()
	{
		return strategy.GetAttackValue();
	}

	public int GetDefenseValue()
	{
		return strategy.GetDefenseValue();
	}
}


使用Context來檢視當它改變策略Strategy時的行為變化

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Main : MonoBehaviour
{
	private Context context;
	// Use this for initialization
	void Start ()
	{
		context = new Context(new WarriorStrategy());
		context.GetAttackValue();
		context.GetDefenseValue();

		context.SetStrategy(new MasterStrategy());
		context.GetAttackValue();
		context.GetDefenseValue();
	}
}


執行Unity,一切正常


模式優點

1、避免使用多重條件

2、易於擴充套件

3、策略類之間只有切換

相關推薦

遊戲設計模式策略模式

部落格地址:blog.liujunliang.com.cn寫在前面在遊戲中計算各個覺得的攻擊值、防禦值時,由於各個角色的職業不同,攻擊值和防禦值計算演算法就會不一樣通常使用if....else語句來抉擇不同型別之間的演算法將帶來程式複雜和難以維持,當有新的演算法或行為時違背開

設計模式 #5 策略模式、代理模式

# 設計模式 #5 (策略模式、代理模式) --- **文章中所有工程程式碼和`UML`建模檔案都在我的這個`GitHub`的公開庫--->[DesignPattern](https://github.com/L1ng14/DesignPattern)。**`Star`來一個好嗎?秋梨膏! --- #

C++重寫《大話設計模式模式例項四策略模式

(宣告:如果想看例項詳細解析,請看《大話設計模式》,這裡文章只是為了加深學習設計模式印象而自己用C++程式寫一遍,以及把程式碼共享給大家。僅僅是把C#語言換成C++表述,不對書中的程式和例子是否合適做個

遊戲設計模式外觀模式

寫在前面 在遊戲中一個場景可能需要與多個系統進行資訊互動,比如戰鬥系統,揹包系統,經濟系統等 在編寫程式碼時候勢必要將各個系統之間的通訊和依賴降低到儘可能的小 這時候適合使用外觀模式,將應用程式只能看到外觀(facade)物件,不必理會內部的細節物件,從而降低應用程式的複雜

設計模式實例(Lua)筆記之Bridge模式

制造 ria 先生 關聯 賣出 都在 int 每一個 賺大錢 1.描寫敘述 今天我要說說我自己,夢想中的我自己,我身價過億,有兩個大公司,一個是房地產公司,一個是服裝制造業,這兩個公司都非常賺錢,天天幫我在累加財富,事實上是什麽公司我倒是不關心,我關心的是是不

23種設計模式之二策略模式

而不是 部分 nts 設定 算法 策略 bstr 算法族 none 策略模式:(分別封裝行為接口,實現算法族,超類裏放行為接口對象,在子類裏具體設定行為對象) 原則:   分離變化部分,封裝接口,基於接口編程各種功能。此模式讓行為算法的變化獨立於算法的使用者。    舉

初識設計模式策略模式

set 實現 string .com int 輸出結果 print 結果 ont   前言:學會總結,學會記錄,與大家分享,也希望大家可以指正錯誤的地方。     為什麽要學設計模式?因為在工作中,感到力不從心了,想重構卻無從下手,所以借此讓設計模式進入到我的大腦中。

設計模式的黃金搭檔一對活寶:命令模式+觀察者模式

現有場景描述:現在無論是系統自帶的鍵盤還是第三方的鍵盤一般都自帶撤銷和恢復功能,你知道它們是用的什麼模式實現的嗎?它們用的是==命令模式+觀察者模式==,你答對了嗎?簡單科普一下啥是==Command模式==? Command模式:- 模式型別:行為類模式- 定義:將一個操作、一個方法呼叫、一個命令封裝成一個

設計模式策略模式、觀察者模式

一:策略模式 策略模式定義了演算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶。 意圖:定義一系列的演算法,把它們一個個封裝起來, 並且使它們可相互替換。 主要解決:在有多種演算法相似的情況下,使用 if...else 所帶來的複雜和難以維護。

設計模式介面卡模式Adapter結構型

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

設計模式之單例模式序列化與反序列化破壞

單例模式的核心是要保證單例,但是在將一個例項序列化到一個檔案中後,再反序列化得到一個例項,這兩個例項是不同的,這就違反了單例原則,如下面惡漢式單例模式對序列化的測試: 由上面的列印資訊可知得到的是兩個不同的例項,通過除錯跟程式碼可以很容易發現,在反序列化時通過反

Java設計模式之從[打飛機遊戲的控制器]分析命令(Command)模式

  首先請允許我囉嗦幾句。為什麼我們在軟體設計過程中強調設計模式?為軟體增加設計模式確實會增加一定的程式碼複雜程度,但是它的好處是無窮的。它可以使得軟體更加易於擴充套件而無需改變原始碼。“解耦”是設計模式中的一個關鍵詞。例如,對於某個物件obj,在呼叫obj.method(

設計模式學習之策略模式Strategy

策略模式是指有一定行動內容的相對穩定的策略名稱。 —抽象策略角色: 策略類,通常由一個介面或者抽象類實現。 —具體策略角色:包裝了相關的演算法和行為。 —環境角色:持有一個策略類的引用,最終給客戶端呼叫。 應用場景: 1、 多個類只區別在表現行為不同,可以使用Str

設計模式例項(Lua)筆記之Bridge模式

1.描述      今天我要說說我自己,夢想中的我自己,我身價過億,有兩個大公司,一個是房地產公司,一個是服裝製造業,這兩個公司都很賺錢,天天幫我在累加財富,其實是什麼公司我倒是不關心,我關心的是是不是在賺錢,賺 了多少,這才是我關心的,我是商人呀,唯利是圖是我的本性,偷稅漏

Java設計模式思想單列模式,工廠模式策略模式,共23種設計模式

a) 單例模式:單例模式核心只需要new一個例項物件的模式,    比如資料庫連線,線上人數等,一些網站上看到的線上人數統計就是通過單例模式實現的,    把一個計時器存放在資料庫或者記憶體中,當有人登陸的時候取出來加一再放回去,    有人退出登陸的時候取出來減一再放回去,

設計模式 ( 十八 ) 策略模式Strategy物件行為型

1.概述         在軟體開發中也常常遇到類似的情況,實現某一個功能有多種演算法或者策略,我們可以根據環境或者條件的不同選擇不同的演算法或者策略來完成該功能。如查詢、排序等,一種常用的方法是硬編碼(Hard Coding)在一個類中,如需要提供多種查詢演算法,可以

設計模式模式PK:策略模式VS橋梁模式

情況 很多 一個 sub 編寫 場景 多態 文本 gets 1、概述 我們先來看兩種模式的通用類圖。 兩者之間確實很相似。如果把策略模式的環境角色變更為一個抽象類加一個實現類,或者橋梁模式的抽象角色未實現,只有修正抽象化角色,想想看,這兩個類圖有什麽地方不一樣?完全一樣!

設計模式5命令模式,叠代器模式

對象的訪問 叠代器模式 元素 div 使用 ble col top 執行 命令模式 本質是封閉請求,其關鍵是把請求封閉成對象,也就是命令對象,並定義了統一的執行操作的接口,這個命令可以存儲、轉發、記錄、處理、撤消等。整個命令模式都是圍繞這個對象進行。 命令

設計模式4代理模式,觀察者模式

代理 bject body border 策略 解決 設計模式 server 觀察者 代理模式 本質是控制對主題對象的訪問 功能 目的 代理模式 但是代理對象則提供與目標對象相同的接口 控制對象的訪問 適配器模式 解決接口

1.Strategy Pattern策略模式

color span adb behavior 具體類 hid pad mage form 策略模式(Strategy Pattern):   我的理解,將代碼中每個變化之處抽出,提煉成一個一個的接口或者抽象類,讓這些變化實現接口或繼承抽象類成為具體的變化類。再利用多態的功