将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。
建造者模式将客户端与包含多个组成部分的复杂对象的创建过程分离,客户端无需知道复杂对象的内部组成与装配方式,主需要知道所需的建造者即可。类似工厂方法,但是建造者模式返回一个完整的复杂产品,而抽象工厂模式则返回一系列相关的产品。以汽车为例,工厂方法可以看成不同汽车配件的生成,而建造者模式则可以看成时汽车的组装
写一个事件触发器,点击地图地点触发场景传送;点击资料片播放过场动画
创建接收者抽象类、具体类 —— 场景传送、触发剧情
// 抽象接收者类 Receiver
UCLASS()
class DESIGNPATTERNS_API UCmdReceiver : public UObject
{
GENERATED_BODY()
public:
virtual void Action() { check(0 && "You must override this"); }
};
// 具体接收者类 Receiver —— 场景传送
UCLASS()
class DESIGNPATTERNS_API ULevelPortal : public UCmdReceiver
{
GENERATED_BODY()
public:
virtual void Action() override {
UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" 传送到下一个场景"));
}
};
// 具体接收者类 Receiver —— 资料片播放
UCLASS()
class DESIGNPATTERNS_API UCutscene : public UCmdReceiver
{
GENERATED_BODY()
public:
virtual void Action() override {
UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" 播放剧情动画"));
}
};
抽象命令类、具体命令类 —— 场景传送命令、资料片播放命令
// 抽象命令类
UCLASS(Abstract)
class DESIGNPATTERNS_API UCommand : public UObject
{
GENERATED_BODY()
public:
void SetReceiver(UCmdReceiver* pCmdReceiver) { m_pCmdReceiver = pCmdReceiver; }
// 调用接收者的 Action
virtual void Execute() {
if (m_pCmdReceiver)
{
m_pCmdReceiver->Action();
}
}
// virtual void undo()
protected:
UCmdReceiver *m_pCmdReceiver;
};
// 具体命令类 —— 场景传送命令
UCLASS()
class DESIGNPATTERNS_API UPortalCommand : public UCommand
{
GENERATED_BODY()
public:
// 可重载做些额外的工作
//virtual void Execute() override { }
};
// 具体命令类 —— 资料片播放命令
UCLASS()
class DESIGNPATTERNS_API UCutsceneCommand : public UCommand
{
GENERATED_BODY()
public:
// 可重载做些额外的工作
//virtual void Execute() override { }
};
调用者 Invoker
UCLASS()
class DESIGNPATTERNS_API ACommandActor : public AActor
{
GENERATED_BODY()
public:
void BeginPlay() override {
// 创建接收者 场景传送
ULevelPortal* LevelPortal = NewObject<ULevelPortal>();
// 创建命令对象
UPortalCommand* PortalCommand = NewObject<UPortalCommand>();
PortalCommand->SetReceiver(LevelPortal);
// this 当做调用者 Invoker
PortalCommand->Execute();
// 创建接收者 资料片播放
UCutscene* Cutscene = NewObject<UCutscene>();
// 创建命令对象
UCutsceneCommand* CutsceneCommand = NewObject<UCutsceneCommand>();
CutsceneCommand->SetReceiver(Cutscene);
// this 当做调用者 Invoker
CutsceneCommand->Execute();
}
};
调式输出
LogTemp: Warning: ULevelPortal::Action 传送到下一个场景
LogTemp: Warning: UCutscene::Action 播放剧情动画
原文:https://www.cnblogs.com/shiroe/p/14854347.html