細心!用心!耐心!

          吾非文人,乃市井一俗人也,讀百卷書,跨江河千里,故申城一游; 一兩滴辛酸,三四年學業,五六點粗墨,七八筆買賣,九十道人情。

          BlogJava 聯系 聚合 管理
            1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks
          您想要建立一個迷宮產生程式,迷宮使用二維陣列來定義,0表示道路,1表示牆,2表示寶物,根據所定義的二維迷宮陣列,您想要程式自動產生各種不同材質的迷宮,例如磚牆迷宮,鑽石迷宮等等。

          您可以在程式中定義兩個角色,一個是指導迷宮建立的Director角色,一個是按照指導者指示建立迷宮的Builder角色,Director根據定義的迷宮陣列來指導Builder,只要更換Builder,就可以完成不同材質的迷宮。

          可以使用下面的UML 類別圖來表示上述的概念:
          Builder
          實際上的程式設計如下:
          • MazeDirector.java
          public class MazeDirector {
          private int[][] maze;
          private IMazeBuilder mazeBuilder;

          public void setMaze(int[][] maze) {
          this.maze = maze;
          }

          public void setMazeBuilder(IMazeBuilder mazeBuilder) {
          this.mazeBuilder = mazeBuilder;
          }

          public void buildMaze() {
          for(int i = 0; i < maze.length; i++) {
          for(int j = 0; j < maze[i].length; j++) {
          // 由於mazeBuilder是IMazeBuilder型態
          // 所以無論Builder實例為何,這邊的程式都無需變動
           switch (maze[i][j]) {
          case 0:
          mazeBuilder.createRoadBlock();
          break;
          case 1:
          mazeBuilder.createWallBlock();
          break;
          case 2:
          mazeBuilder.createTreasureBlock();
          break;
          default:
          System.out.println("undefined");
          }
          }
          mazeBuilder.nextRow();
          }
          }
          }

          • IMazeBuilder.java
          public interface IMazeBuilder {
          public void createRoadBlock();
          public void createWallBlock();
          public void createTreasureBlock();
          public void nextRow();
          }

          • SoliderMazeBuilder.java
          public class SolidMazeBuilder implements IMazeBuilder {
          public void createWallBlock() {
          System.out.print("█");
          }

          public void createRoadBlock() {
          System.out.print(" ");
          }

          public void createTreasureBlock() {
          System.out.print("$ ");
          }

          public void nextRow() {
          System.out.println();
          }
          }

          • DiamondMazeBuilder.java
          public class DiamondMazeBuilder implements IMazeBuilder {
          public void createWallBlock() {
          System.out.print("◇");
          }

          public void createRoadBlock() {
          System.out.print(" ");
          }

          public void createTreasureBlock() {
          System.out.print("* ");
          }

          public void nextRow() {
          System.out.println();
          }
          }

          使用下面的程式來測試一下,它將產生兩個迷宮圖形:
          public class Main {
          public static void main(String[] args) {
          int[][] maze = {{1, 1, 1, 1, 1, 1, 1},
          {1, 0, 0, 0, 0, 2, 1},
          {1, 0, 1, 0, 1, 0, 1},
          {1, 0, 2, 1, 0, 1, 1},
          {1, 1, 0, 1, 0, 1, 1},
          {1, 0, 0, 2, 0, 0, 1},
          {1, 1, 1, 1, 1, 1, 1}};

          MazeDirector mazeDirector = new MazeDirector();
          mazeDirector.setMaze(maze);

          System.out.println("Build SolidMaze....");
          mazeDirector.setMazeBuilder(new SolidMazeBuilder());
          mazeDirector.buildMaze();

          System.out.println("Build DiamondMaze....");

          mazeDirector.setMazeBuilder(
          new DiamondMazeBuilder());
          mazeDirector.buildMaze();
          }
          }

          Builder

          在迷宮例子中並沒有產生或返回產品物件,這視您的需求而定,迷宮例子只是將結果輸出至主控臺,您也可以設計一個產品物件,或是將結果直接輸出為文件。

          Gof 中有給出了一個不錯的例子,以設計文件剖析器為例,該剖析器可以將文件轉換為其它的格式,以DOC文件剖析器為例好了,假設希望析剖器可以將DOC文件轉換為RTF或是PDF文件,可以如下設計結構:
          Builder

          簡單來說,建築者模式適用的場合,在於使得您可以依賴抽象的建築藍圖,而實際建造時可以使用不同的實例,這是其之所以命為Builder的原因.
          posted on 2007-04-17 10:35 張金鵬 閱讀(253) 評論(0)  編輯  收藏 所屬分類: Creational 模式
          主站蜘蛛池模板: 乌兰县| 子长县| 临高县| 巴彦县| 舒兰市| 隆尧县| 阜宁县| 麻江县| 承德县| 枣庄市| 乐业县| 西充县| 军事| 区。| 贡山| 青龙| 黄骅市| 怀仁县| 湟源县| 垫江县| 卫辉市| 霍山县| 麦盖提县| 安新县| 清河县| 资中县| 桐城市| 邯郸市| 济源市| 任丘市| 微山县| 城固县| 蚌埠市| 茂名市| 抚顺县| 鹰潭市| 浦北县| 桐梓县| 遵义县| 盐亭县| 萨迦县|