目录

实现不同职业(种族),使用不同的武器
- 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
(); - UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" 这是一个战士"));
- }
- };
- UCLASS() // 环境类 —— 弓箭手
- class DESIGNPATTERNS_API UArcher : public UHero
- {
- GENERATED_BODY()
- public:
- UArcher() { // 为不同角色初始化武器
- m_pWeapon = NewObject
(); - 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
(); - // 使用策略 —— 使用武器
- Warrior->UseWeapon();
-
- // 更换策略 —— 更换武器
- Warrior->ChangeWeapon(NewObject
()); - Warrior->UseWeapon();
-
- // 更换策略,不使用武器
- Warrior->ChangeWeapon(NewObject
()); - Warrior->UseWeapon();
-
- UE_LOG(LogTemp, Warning, TEXT("---------------------------------------"));
- // 创建弓箭手
- UArcher* Archer = NewObject
(); - // 使用策略 —— 使用武器
- Archer->UseWeapon();
-
- // 更换策略,不使用武器
- Archer->ChangeWeapon(NewObject
()); - 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 大刀已装备