设计模式专题之C语言-代理模式

1.简介

代理模式是一种结构型设计模式,它允许你提供一个替代对象来控制对某个对象的访问。这种模式在需要增加额外职责而又不想修改原始类的情况下非常有用。

2.通俗讲解

假设你正在开发一款游戏,游戏中玩家可以购买虚拟物品。但是,并非所有的物品都能直接被玩家获取。例如,某些稀有物品可能需要特殊的条件才能解锁。为了管理这些条件和解锁过程,我们可以使用代理模式。

3.实战

在这个例子中,我们有两个主要的角色:

  1. 真实主题 (Subject): 代表真实的虚拟物品,比如一把稀有的剑。
  2. 代理 (Proxy): 代表这把剑的代理,负责检查玩家是否满足获得该剑的条件。

3.1.代码

#include <stdio.h>
#include <string.h>

// 定义一个接口(结构体)
typedef struct Item {
    char name[50];
} Item;

// 真实主题
void getRareSword(Item *sword) {
    printf("获取了稀有的剑: %s\n", sword->name);
}

// 代理
void proxyGetRareSword(char *playerName, Item *sword) {
    // 检查玩家是否满足条件
    if (strcmp(playerName, "Hero") == 0) {
        getRareSword(sword);
    } else {
        printf("对不起,%s,你还没有资格获取这把稀有的剑。\n", playerName);
    }
}

int main() {
    Item rareSword;
    strcpy(rareSword.name, "Excalibur");

    char *player = "Hero";
    proxyGetRareSword(player, &rareSword);

    player = "Villager";
    proxyGetRareSword(player, &rareSword);

    return 0;
}

3.2.代码解析

  • Item 结构体 定义了一个虚拟物品的基本属性,这里只包括名称。
  • getRareSword 函数 是真实主题的行为,它简单地打印出获取的物品名称。
  • proxyGetRareSword 函数 是代理的行为,它会根据玩家的名字决定是否允许玩家获取稀有剑。
  • main 函数 创建了一个稀有剑实例,并尝试让不同的玩家获取它。

3.3.代码运行

获取了稀有的剑: Excalibur
对不起,Villager,你还没有资格获取这把稀有的剑。

3.4.结果分析

  1. 初始化物品:在main函数中,我们创建了一个Item类型的变量rareSword,并将其命名为“Excalibur”。
  2. 玩家尝试获取物品:我们分别让两个不同身份的玩家尝试获取稀有剑。第一个玩家是“Hero”,第二个玩家是“Villager”。
    • Hero:由于proxyGetRareSword函数检查了玩家的名字是否为“Hero”,所以当第一个玩家尝试获取稀有剑时,代理会调用getRareSword函数,打印出成功获取的信息。
    • Villager:对于第二个玩家,代理检测到名字不是“Hero”,因此没有调用getRareSword函数,而是打印了一条消息告诉玩家他们没有资格获取稀有剑。

4.总结

这个简单的例子展示了如何使用代理模式来控制对稀有物品的访问。代理模式在这里充当了一个门卫的角色,确保只有符合条件的玩家才能获取特定的物品。这种方式可以轻松地扩展,例如添加更多的条件或处理更复杂的逻辑,而不需要更改真实的物品获取逻辑。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

甜航一直在

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值