设计模式学习笔记(二)——Build生成器

本文介绍了一种使用生成器模式创建迷宫的程序设计方法。通过MazeGame指导MazeBuilder逐步构建迷宫,展示了如何利用面向对象编程实现复杂结构的模块化构建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二、Build(生成器)

情景举例:

创建一个可重用的建造迷宫程序。

代码示例:

/* 用非抽象类来让客户只定义自己感兴趣的操作
*/
class MazeBuilder {
public:
    virtual void BuildMaze() { }
    virtual void BuildRoom(int room) { }
    virtual void BuildDoor(int roomFrom, int roomTo) { }
 
    virtual Maze* GetMaze() { return 0; }
protected:
    MazeBuilder();
};
/* 使用MazeBuilder来一步一步创建一个Maze
*/
Maze* MazeGame::CreateMaze (MazeBuilder& builder) {
    builder.BuildMaze();
 
    builder.BuildRoom(1);
    builder.BuildRoom(2);
    builder.BuildDoor(1, 2);
 
    return builder.GetMaze();
}
/* 可以重用MazeBuilder来创建不同种类的迷宫
*/
Maze* MazeGame::CreateComplexMaze (MazeBuilder& builder) {
    builder.BuildRoom(1);
    // ...
    builder.BuildRoom(1001);
 
    return builder.GetMaze();
}
/* MazeBuilder子类,重新定义其操作
*/
class StandardMazeBuilder : public MazeBuilder {
public:
    StandardMazeBuilder();
/*
*/
    virtual void BuildMaze();
    virtual void BuildRoom(int);
    virtual void BuildDoor(int, int);
/*
*/
    virtual Maze* GetMaze();
private:
    Direction CommonWall(Room*, Room*);
    Maze* _currentMaze;
};
/* 在主程序调用CreateMaze,StandardMazeBuilder为参数
*/
Maze* maze;
MazeGame game;
StandardMazeBuilder builder;
 
maze = game.CreateMaze(builder);
 

个人理解:

MazeBuild为生成器,MazeGame为使用生成器的导向器,导向器可以重复使用Build来进行不同的生成操作(如例中的CreateMazeCreateComplexMaze)。而导向器的操作大部分使用的是Build中定义的操作,即一步步精细地生成产品(即Maze)。

Build类是一个抽象类,其中的操作都是空操作。注意不是纯抽象类,故意这么做是为了让Build的子类能够只定义自己感兴趣的操作。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值