目录
动态的给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活,是一种对象结构型模式。

以前的账户登录:账号+密码
现在的账户登录:账号+密码+人脸识别
可以把人脸识别用装饰器实现
- UCLASS(Abstract) // 抽象构件类 —— 账户登录
- class DESIGNPATTERNS_API ULogin : public UObject
- {
- GENERATED_BODY()
-
- protected:
-
- public:
- virtual bool LoginVerify(const FString& pName, const FString& pPassword) {
- return true;
- }
- };
- UCLASS() // 具体构件类 —— 账户登录 联网版本
- class DESIGNPATTERNS_API UWebLogin : public ULogin
- {
- GENERATED_BODY()
-
- protected:
-
- public:
- virtual bool LoginVerify(const FString& pName, const FString& pPassword) override {
- bool result;
- UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" LinkWeb:Account ID Verify"));
- result = true;
- return result;
- }
- };
- UCLASS() // 装饰器具体类 —— 扩展人脸识别步骤
- class DESIGNPATTERNS_API UWebLoginWithFaceID : public ULogin
- {
- GENERATED_BODY()
-
- protected:
- // 被装饰的对象
- UPROPERTY();
- ULogin* m_pLoginObj;
- public:
- // 初始化被装饰的对象
- void Init(ULogin* pLoginObj) {
- m_pLoginObj = pLoginObj;
- }
-
- // 装饰的新功能 —— 人脸识别
- bool FaceIDVerify(const FString& pName) {
- UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" %s Face ID Verify"), *pName);
- return true;
- }
-
- virtual bool LoginVerify(const FString& pName, const FString& pPassword) override {
- bool result;
- result = m_pLoginObj->LoginVerify(pName, pPassword);
- // 追加人脸识别步骤
- result = result && FaceIDVerify(pName);
- return result;
- }
- };
测试
- UCLASS()
- class DESIGNPATTERNS_API ADecoratorTestActor : public AActor
- {
- GENERATED_BODY()
-
- public:
- ADecoratorTestActor();
- virtual void Tick(float DeltaTime) override;
-
- protected:
- // Called when the game starts or when spawned
- virtual void BeginPlay() override {
- // 被装饰对象及登录步骤
- ULogin* WebLogin = NewObject
(); - WebLogin->LoginVerify("admin", "123456");
-
- // 装饰器对象及初始化
- UWebLoginWithFaceID* WebLoginWithFaceID = NewObject
(); - WebLoginWithFaceID->Init(WebLogin);
-
- // 装饰后的登录步骤
- WebLoginWithFaceID->LoginVerify("admin", "123456");
- }
- };
- # 旧登录方式
- LogTemp: Warning: UWebLogin::LoginVerify LinkWeb:Account ID Verify
-
- # 新登录方式
- LogTemp: Warning: UWebLogin::LoginVerify LinkWeb:Account ID Verify
- LogTemp: Warning: UWebLoginWithFaceID::FaceIDVerify admin Face ID Verify