- , .
. , RTF-.
. , - . ( RTF-) , . , RTFReader, RTF-; RTFReader Text Converter.
, :
- , ;
- .
-Builder (TextConverter) - :
- Product;
a ConcreteBuilder(ASCIIConverter,TeXConverter,TextWidgetConverter)-
:
- Builder;
- ;
- (, GetASCI IText, GetTextWidget);
- irector (RTFReader) - :
- , Builder;
- roduct (ASCIIText, TeXText, TextWidget) - :
- . ConcreteBuilder
;
- , , .
- - Director - Builder;
- , ;
- ;
- .
.
:
- . Builder , , . , ;
|
|
- , . , . , , .
ConcreteBuilder , -
. , .
RTF- , RTF, , SGMLReader, TextConverters SGML- ASCII-, - ;
. , , .
, .
, . ,
, .
Builder, , .
. ConcreteBuilder , .
:
- . . Builder , .
. , . RTF- .
. , , MazeBui Ider . , , , . - , , .
- . , , , . RTF- ASCIIText TextWidget, .
, , , , Builder ;
|
|
- Builder no . C++ -.
, , .
- CreateMaze, , MazeBuilder.
MazeBuilder -
:
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();
};
: , , . GetMaze . MazeBui Ider .
MazeBuilder
. , .
MazeBuilder, - CreateMaze,
:
Maze* MazeGame::CreateMaze (MazeBuilder& builder) {
builder.BuildMaze();
builder.BuiIdRoom(l);
builder.BuiIdRoom(2);
builder.BuildDoor(1, 2);
return builder.GetMaze();
}
CreateMaze . , , , , . -, , , , . , MazeBuilder .
, ; , MazeBuilder. , MazeBuilder . GreateComplexMaze:
Maze* MazeGame::CreateComplexMaze (MazeBuilder& builder) {
builder.BuildRoom(l);
builder.BuildRoom(lOOl);
return builder.GetMazeO; }
, MazeBuilder , - .
. MazeBuilder.
StandardMazeBuilder
. , _currentMaze:
class StandardMazeBuilder: public MazeBuilder {
public:
StandardMazeBuilder();
virtual void BuildMazeO;
virtual void BuildRoom(int);
virtual void BuildDoor(int, int);
virtual Maze* GetMazef);
private:
Direction CommonWall(Room*, Room*);
Maze* _currentMaze;
};
CommonWall ( ) - , .
StandardMazeBuilder currentMaze:
StandardMazeBuilder::StandardMazeBuilder () {
_currentMaze = 0;
}
BuildMaze Maze, , , ( GetMaze):
void StandardMazeBuilder:: BuildMaze () {
_currentMaze = new Maze;
}
Maze* StandardMazeBuilder::GetMaze () {
return _currentMaze;
}
BuildRoom :
|
|
void StandardMazeBuilder::BuildRoom (int n) {
if (!_currentMaze->RoomNo(n)) {
Room* room = new Room(n);
_currentMaze->AddRoom(room);
room->SetSide(North, new W a l l);
room->SetSide(South, new W a l l);
room->SetSide(East, new W a l l);
room->SetSide(West, new Wall);
}
}
, StandardMazeBuilder :
void StandardMazeBuilder: rBuildDoor (int nl, int n2) {
Room* rl = _currentMaze->RoomNo (nl);
Room* r2 = _currentMaze->RoomNo (n2);
Door* d = new Door(rl, r2);
rl->SetSide(CommonWall(rl,r2), d);
r2->SetSide(CommonWall(r2,rl), d);
}
Great eMaze StandardMazeBuilder:
Maze* maze;
MazeGame game;
StandardMazeBuilder builder;
game. CreateMaze (builder);
maze = builder. GetMaze ();
StandardMazeBuilder Maze . Maze, , a StandardMazeBuilder Maze. , MazeBuilder, , .
MazeBuiIder Count ingMazeBuiIder.
, , :
class CountingMazeBuilder: public MazeBuilder {
public:
CountingMazeBuilderO;
virtual void BuildMazeO;
virtual void BuildRoom(int);
virtual void BuildDoor (int, int);
virtual void AddWall(int, Direction);
void GetCounts (int&, int&) const;
private:
int _doors,-
int _rooms;
};
,
MazeBuilder :
CountingMazeBuilder:: CountingMazeBuilder () {
_rooms = _doors = 0;
}
void CountingMazeBuilder::BuildRoom (int) {
_rooms++;
}
void CountingMazeBuilder:.-BuildDoor (int, int) {
_doors++;
}
void CountingMazeBuilder::GetCounts (
int& rooms, int& doors
) const {
rooms = _rooms;
doors = _doors;
}
CountingMazeBuilder:
int rooms, doors;
MazeGame game;
CountingMazeBuilder builder;
game.CreateMaze(builder);
buiIder.GetCount s(rooms, doors);
cout " "
rooms " "
doors " " endl;
RTF
++ [WGM88]. , .
Smalltalk-80 []:
Parser - , ProgramNodeBuilder. Parser ProgramNodeBuilder . Parser ;
- Class Builder- , . ;
- ByteCodeStream- ,
. ByteCodeStream , , Smalltalk. ByteCodeStream , , .
|
|
, . , , - ( ). , .
- , .
Factory Method