【设计模式】题目小练2

// 题1. AI 对话系统

// 你要做一个 NPC 对话系统:

// 不同 NPC 有不同的对话脚本(村民、商人、战士)。

// 同时对话还会受玩家状态影响(任务是否完成、声望高低)。

// 👉 请结合 模板方法模式 和 策略模式,设计一下系统结构。

cs 复制代码
using System;

// 抽象策略
public interface ISpeakStrategy
{
    string Execute();
}

// 具体策略
public class RespectStrategy : ISpeakStrategy
{
    public string Execute() => "尊敬";
}
public class StrangeStrategy : ISpeakStrategy
{
    public string Execute() => "陌生";
}
public class SeriousStrategy : ISpeakStrategy
{
    public string Execute() => "严肃";
}
public class AppreciateStrategy : ISpeakStrategy
{
    public string Execute() => "赞赏";
}

// 模板方法模式 ------ NPC基类
public abstract class NPC
{
    // 模板方法:定义固定流程
    public void Talk(ISpeakStrategy strategy)
    {
        Greet();
        CoreDialogue(strategy);
        Farewell();
    }

    protected abstract void Greet();                    // 打招呼
    protected abstract void CoreDialogue(ISpeakStrategy strategy);  // 核心对话
    protected abstract void Farewell();                 // 告别
}

// 具体NPC
public class Villager : NPC
{
    protected override void Greet() => Console.WriteLine("村民:你好啊!");
    protected override void CoreDialogue(ISpeakStrategy strategy)
        => Console.WriteLine($"村民用「{strategy.Execute()}」的语气交谈。");
    protected override void Farewell() => Console.WriteLine("村民:路上小心!");
}

public class Merchant : NPC
{
    protected override void Greet() => Console.WriteLine("商人:客官请进。");
    protected override void CoreDialogue(ISpeakStrategy strategy)
        => Console.WriteLine($"商人用「{strategy.Execute()}」的语气讨价还价。");
    protected override void Farewell() => Console.WriteLine("商人:欢迎下次光临!");
}

public class Warrior : NPC
{
    protected override void Greet() => Console.WriteLine("战士:哼,你找我吗?");
    protected override void CoreDialogue(ISpeakStrategy strategy)
        => Console.WriteLine($"战士用「{strategy.Execute()}」的语气交流。");
    protected override void Farewell() => Console.WriteLine("战士:走好,不要添麻烦。");
}

// 玩家状态决定策略
public class Player
{
    public bool IsCompletedTask { get; set; }
    public float Reputation { get; set; }

    public ISpeakStrategy ChooseStrategyByTask()
        => IsCompletedTask ? new SeriousStrategy() : new AppreciateStrategy();

    public ISpeakStrategy ChooseStrategyByReputation()
        => Reputation >= 60f ? new RespectStrategy() : new StrangeStrategy();
}

// 客户端测试
public class Client
{
    public static void Main()
    {
        Player player = new Player { IsCompletedTask = true, Reputation = 80 };

        NPC villager = new Villager();
        NPC merchant = new Merchant();
        NPC warrior = new Warrior();

        villager.Talk(player.ChooseStrategyByReputation());
        merchant.Talk(player.ChooseStrategyByReputation());
        warrior.Talk(player.ChooseStrategyByTask());
    }
}
相关推荐
北凉军5 分钟前
java连接达梦数据库,用户名是其他库的名称无法指定库,所有mapper查询的都是以用户名相同的库内的表
java·开发语言·数据库
wuk99815 分钟前
基于C#与三菱PLC通过TCPIP实现MC协议通信示例
java·网络·c#
沛沛老爹22 分钟前
Web转AI架构篇 Agent Skills vs MCP:工具箱与标准接口的本质区别
java·开发语言·前端·人工智能·架构·企业开发
avi911131 分钟前
Unity 天命6源码- 商业游戏说明分析
开发语言·unity·c#·游戏开发·游戏源码
低频电磁之道1 小时前
编译C++的几种方式(MSVC编译器)
开发语言·c++
Zsy_0510031 小时前
【C++】类和对象(一)
开发语言·c++
星火开发设计2 小时前
Java面向对象三大特性:封装、继承与多态的深度解析及实战
java·开发语言·microsoft·多态·继承·面向对象·封装
旅途中的宽~2 小时前
【Python】pip install -v e .命令不想自动更新torch版本
开发语言·python·pip
lly2024062 小时前
Vue3 指令详解
开发语言
_OP_CHEN2 小时前
【从零开始的Qt开发指南】(二十三)Qt 界面优化之 QSS 实战指南:从入门到精通,让你的界面颜值飙升!
开发语言·c++·qt·前端开发·界面美化·qss·客户端开发