全球旧事资料 分类
另一个例子。在这种情况下,生成器会将子结点返回给导向者,然后导向者将它们回传给生成者去创建父结点。2为什么产品没有抽象类通常情况下,由具体生成器生成的产品,它们的表示相差是如此之大以至于给不同的产品以公共父类没有太大意思。在RTF例子中,ASCIIText和TextWidget对象不太可能有公共接口,它们也不需要这样的接口。因为客户通常用合适的具体生成器来配置导向者,客户处于的位置使它知道Builder的哪一个具体子类被使用和能相应的处理它的产品。3在Builder中却省的方法为空C中,生成方法故意不声明为纯虚成员函数,而是把它们定义为空方法,这使客户只重定义他们所感兴趣的操作。9代码示例我们将定义一个CreateMaze成员函数的变体,它以类MazeBuilder的一个生成器对象作为参数。MazeBuilder类定义下面的接口来创建迷宫:
f该接口可以创建:1)迷宫。2)有一个特定房间号的房间。3)在有号码的房间之间的门。GetMaze操作返回这个迷宫给客户。MazeBuilder的子类将重定义这些操作,返回它们所创建的迷宫。MazeBuilder的所有建造迷宫的操作缺省时什么也不做。不将它们定义为纯虚函数是为了便于派生类只重定义它们所感兴趣的那些方法。用MazeBuilder接口,我们可以改变CreateMaze成员函数,以生成器作为它的参数。将这个CreateMaze版本与原来的相比,注意生成器是如何隐藏迷宫的内部表示的即定义房间、门和墙壁的那些类以及这些部件是如何组装成最终的迷宫的。有人可能猜测到有一些类是用来表示房间和门的,但没有迹象显示哪个类是用来表示墙壁的。这就使得改变一个迷宫的表示方式要容易一些,因为所有MazeBuilder的客户都不需要被改变。像其他创建型模式一样,Builder模式封装了对象是如何被创建的,在这个例子中是通过MazeBuilder所定义的接口来封装的。这就意味着我们可以重用MazeBuilder来创建不同种类的迷宫。reateCompClexMaze操作给出了一个例子:注意MazeBuilder自己并不创建迷宫;它的主要目的仅仅是为创建迷宫定义一个接口。它主要为方便起见定义一些空的实现。MazeBuilder的子类做实际工作。子类Sta
dardMazeBuilder是一个创建简单迷宫的实现。它将它正在创建的迷宫放在变量_curre
tMaze中。
fCommo
Wall是一个功能性操作,它决定两个房间之间的公共墙壁的方位。Sta
dardMazeBuilder的构造器只初始化了_curre
tMar
好听全球资料 返回顶部