策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。
实现不同职业(种族),使用不同的武器
创建策略抽象类、具体类 —— 武器,剑、刀、长弓、无武器
UCLASS(Abstract) // 抽象策略类 —— 武器
class DESIGNPATTERNS_API UWeapon : public UObject
{
GENERATED_BODY()
public:
virtual void UseWeapon() {}
};
UCLASS() // 具体策略类 —— 剑
class DESIGNPATTERNS_API USword : public UWeapon
{
GENERATED_BODY()
public:
virtual void UseWeapon() override {
UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" 长剑已装备"));
}
};
UCLASS() // 具体策略类 —— 刀
class DESIGNPATTERNS_API UMachete : public UWeapon
{
GENERATED_BODY()
public:
virtual void UseWeapon() override {
UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" 大刀已装备"));
}
};
UCLASS() // 具体策略类 —— 无武器
class DESIGNPATTERNS_API UNoWapon : public UWeapon
{
GENERATED_BODY()
public:
virtual void UseWeapon() override {
UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" 赤手空拳"));
}
};
UCLASS() // 具体策略类 —— 长弓
class DESIGNPATTERNS_API ULongbow : public UWeapon
{
GENERATED_BODY()
public:
virtual void UseWeapon() override {
UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" 长弓已装备"));
}
};
创建环境类,采用继承的方式创建不同的角色类,此处有战士和弓箭手
UCLASS(Abstract) // 环境抽象类 —— 角色
class DESIGNPATTERNS_API UHero : public UObject
{
GENERATED_BODY()
public:
// 使用策略 —— 使用武器
virtual void UseWeapon() {
if (m_pWeapon)
{
m_pWeapon->UseWeapon();
}
}
// 更换策略 —— 更换武器
virtual void ChangeWeapon(UWeapon* pWeapon ) {
m_pWeapon = pWeapon;
UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" 武器已更换"));
}
protected:
UPROPERTY()
UWeapon* m_pWeapon;
};
UCLASS() // 环境类 —— 战士
class DESIGNPATTERNS_API UWarrior : public UHero
{
GENERATED_BODY()
public:
UWarrior() { // 为不同角色初始化武器
m_pWeapon = NewObject<USword>();
UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" 这是一个战士"));
}
};
UCLASS() // 环境类 —— 弓箭手
class DESIGNPATTERNS_API UArcher : public UHero
{
GENERATED_BODY()
public:
UArcher() { // 为不同角色初始化武器
m_pWeapon = NewObject<ULongbow>();
UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" 这是一个弓箭手"));
}
};
调用测试
UCLASS()
class DESIGNPATTERNS_API AStrategyTestActor : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor‘s properties
AStrategyTestActor();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override {
// 创建战士
UWarrior* Warrior = NewObject<UWarrior>();
// 使用策略 —— 使用武器
Warrior->UseWeapon();
// 更换策略 —— 更换武器
Warrior->ChangeWeapon(NewObject<UMachete>());
Warrior->UseWeapon();
// 更换策略,不使用武器
Warrior->ChangeWeapon(NewObject<UNoWapon>());
Warrior->UseWeapon();
UE_LOG(LogTemp, Warning, TEXT("---------------------------------------"));
// 创建弓箭手
UArcher* Archer = NewObject<UArcher>();
// 使用策略 —— 使用武器
Archer->UseWeapon();
// 更换策略,不使用武器
Archer->ChangeWeapon(NewObject<UNoWapon>());
Archer->UseWeapon();
}
};
调式输出
LogTemp: Warning: UWarrior::UWarrior 这是一个战士
LogTemp: Warning: USword::UseWeapon 长剑已装备
LogTemp: Warning: UHero::ChangeWeapon 武器已更换
LogTemp: Warning: UMachete::UseWeapon 大刀已装备
LogTemp: Warning: UHero::ChangeWeapon 武器已更换
LogTemp: Warning: UMachete::UseWeapon 大刀已装备
LogTemp: Warning: ---------------------------------------
LogTemp: Warning: UArcher::UArcher 这是一个弓箭手
LogTemp: Warning: ULongbow::UseWeapon 长弓已装备
LogTemp: Warning: UHero::ChangeWeapon 武器已更换
LogTemp: Warning: UMachete::UseWeapon 大刀已装备
【UE4 设计模式】策略模式 Strategy Pattern
原文:https://www.cnblogs.com/shiroe/p/14909707.html