添加炸弹房的迷宫 工厂模式修改 已编译过

#include <iostream>

using namespace std;

enum Direction {
    North,
    East,
    South,
    West,
};

class MapSite {
public:
    virtual void Enter() = 0;
};

class Room : public MapSite {
public:
    Room(int roomNo):_roomNumber(roomNo) {};

    MapSite *GetSide(Direction) const;

    virtual void SetSide(Direction direction, MapSite *) {
        cout << "Set the "
            << _roomNumber
            << " room "
            << direction
            << " side."
            << endl;
    };

    int GetRoomNo() {
        return _roomNumber;
    };

    virtual void Enter() {
        cout << "Enter the Room." << endl;
    };

private:
    MapSite *_sides[4];
    int _roomNumber;
};

class BombRoom : public Room {
public:
    BombRoom(int num):Room(num)
    {
        _roomNum = num;
    };

    virtual void SetSide(Direction direction, MapSite *) {
        cout << "Set the "
            << _roomNum
            << " bomb room "
            << direction
            << " side."
            << endl;
    };
private:
    int _roomNum;
};

class Wall : public MapSite {
public:
    Wall() {};

    virtual void Enter() {
        cout << "Enter the wall." << endl;
    };

};

class Door : public MapSite {
public:
    Door(Room* = 0, Room* = 0) {};

    virtual void Enter()
    {
        cout << "Enter the door." << endl;
    };

    Room *OtherSideFrom(Room*) {};

private:
    Room *_room1;
    Room *_room2;
    bool _isOpen;
};

class Maze {
public:
    Maze() {};

    void AddRoom(Room* room) {
        cout << "Add the room" << room->GetRoomNo() << "." << endl;
    };
    Room* RoomNo(int) const{};
};

class MazeFactory {
public:
    MazeFactory() {};

    virtual Maze* MakeMaze() const {
        return new Maze;
    };

    virtual Wall* MakeWall() const {
        return new Wall;
    };

    virtual Room* MakeRoom(int n) const {
        return new Room(n);
    };

    virtual Door* MakeDoor(Room* r1, Room* r2) const {
        return new Door(r1, r2);
    };
};

class BombMazeFactory : public MazeFactory {
public:
    virtual Room* MakeRoom(int n) const {
        return new BombRoom(n);
    };
};

class MazeGame {
public:
    Maze* CreateMaze(MazeFactory &factory) {
        Maze* aMaze = factory.MakeMaze();
        Room* r1 = factory.MakeRoom(1);
        Room* r2 = factory.MakeRoom(2);
        Door* theDoor = factory.MakeDoor(r1, r2);

        aMaze->AddRoom(r1);
        aMaze->AddRoom(r2);

        r1->SetSide(North, factory.MakeWall());
        r1->SetSide(East, theDoor);
        r1->SetSide(South, factory.MakeWall());
        r1->SetSide(West, factory.MakeWall());

        r2->SetSide(North, factory.MakeWall());
        r2->SetSide(East, factory.MakeWall());
        r2->SetSide(South, factory.MakeWall());
        r2->SetSide(West, theDoor);

        return aMaze;
    };
};

int main() {
    MazeGame mygame;
    //  MazeFactory factory;
    BombMazeFactory factory;
    mygame.CreateMaze(factory);
    system("pause");
    return 0;
}

时间: 2024-08-28 21:06:31

添加炸弹房的迷宫 工厂模式修改 已编译过的相关文章

迷宫 工厂模式练习 编译通过

/************************************************************************/ // 建立一个迷宫(Maze),迷宫的元素是墙.房间.门.它们都是MapSite的子类. // 同时一个房间有四个方向,有可能是墙也有可能是门. */ /************************************************************************/ #include "iostream"

使用jd-gui+javassist修改已编译好的class文件

1.原因:因为公司代码管理不当导致源码丢失,只好已编译好的class文件进行修改 2.首先先在myeclipse中新建java项目并导入javassist 3.将需要修改的文件放到指定文件夹下 4..在项目中添加以下代码 package dtj; import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import javassist.NotFoundException; public cl

工厂模式(Factory)

今天重新学习了下工厂模式:简单工厂模式.工厂方法模式.抽象工厂模式,总结下. 首先,从名字上看,三个模式都有”工厂“二字,工厂,自然是生产产品的,工厂模式就是生产类的实例的,而具体生产哪种实例,怎样生产,何时生产,这就是三种工程工厂的区别,以下先分开阐述: ①,简单工厂模式 之所以简单,我觉得在于它就一个工厂,就实现了生产实例的功能(相对于另外两种工厂模式的多个工厂,确实简单很多),具体实现中,只需要告诉该工厂要生产哪种材料(实例),它就会准确的把相应实例产出给你,用起来是很简单,但维护起来可就

产品蔟的创建--抽象工厂模式

工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责过重的问题,但由于工厂方法模式中每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销.此时,可以考虑将一些相关的产品组成一个"产品蔟",由同一个工厂统一生产,这就是抽象工厂模式的基本思想. 产品等级结构和产品蔟 有时候希望一个工厂可以提供多个产品对象,而不是单一的产品对象.例如一个电器工厂,它可以生产电视机.电冰箱和空调等多种电器,而不是只生产一种电器. 产品等级结构 (1) 产品等级结构即产品的

设计模式---对象创建模式之抽象工厂模式(Abstract Factory)

一:概念 抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的.抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象 二:动机 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作. 如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合. 三:和工厂方法模式区别 工厂模式只能生产一个产品 抽象工厂可以一次

如何将工厂模式的内容显示,从中文修改为英文

开机按开机键+下音量键,进入工厂模式.目前内容显示为中文,如何修改为英文显示. [SOLUTION] (1)关掉SUPPORT_GB2312. ICS版本: \mediatek\source\factory\src\miniui\font.mk中SUPPORT_GB2312 := yes改为no GB3,JB,JB2版本: \mediatek\factory\src\miniui\font.mk中SUPPORT_GB2312 := yes改为no JB3及JB3之后版本: \mediatek\c

及房重构利用策略模式+简单工厂实现消费金额的计算

在做第一次机房收费系统中,有一项很令人头疼的事情,那就是临时用户的问题,在结账的时候,我们需要考虑该用户是固定用户还是临时用户,原来在用VB6.0做的时候,如果我们实现了这个功能,那么在代码中会出现很多的IF....else 语句,同时,我们必须要调用数据设定窗体中的数据,这样的话,会很麻烦,写出来的代码也会很乱,如今学习了设计模式,我们可以利用策略模式来实现对不同用户的消费金额进行计算.将不同的类型用户所用到的不同算法封装到子类中去,同时与简单工厂结合起来,来实现对不同子类的实例化.这样在很大

AOC 电视机T3212M 进入 工厂模式方法,修改开机启动方式

原启动方式: 通电,再按遥控 器上  "开机" 希望改成:  通电直接打开电视 方法: 1. 按遥控器上的 menu  1147  进入 工厂模式 2.  选择   7  General Settings 3.  选择    0   PowerOn Mode 完成 原文地址:https://www.cnblogs.com/sjdn/p/9176074.html

23中设计模式----------抽象工厂模式

抽象工厂模式: 在上一篇中讲到通过各个具体球类(如:足球,篮球等)来继承总球类(Ball),来实现通过BallFactory对具体球类的生产. 不过,当时只是能造出不同球类,而在每种球类中肯定也有颜色,大小等不同的属性.所以,为了实现在工厂中添加属性.将抽象的Ball球类,修改成Bll接口,在该接口中添加所需要的方法: 这种模式是抽象工厂模式,抽象工厂模式是抽象方法模式的升级.在有多个业务品种,业务分级时,采用抽象工厂模式生产需要的对象是一种非常好的解决房还是.(比如,在生产球类的时候,不仅要分