天天看點

實作樹狀結構_組合模式 - 樹狀結構的優雅實作

實作樹狀結構_組合模式 - 樹狀結構的優雅實作

在程式設計實踐中,經常會遇到樹狀結構的場景,比如我們的浏覽器視窗,比如檔案系統。

那麼,在處理樹狀結構的時候有什麼較好的方式呢?

現在,我們就來學習一種利用組合模式的方法。

實作樹狀結構_組合模式 - 樹狀結構的優雅實作

如上圖所示,我們通過程式輸出的方式模拟視窗渲染的過程。

下面直接上代碼,首先定義一個接口,所有的元件都需要實作這個接口。

public interface ViewTree {
 void draw();
}
           

定義視窗類:

public class TreeWindow implements ViewTree {

 private String windowName;

 private List<ViewTree> subTree;

 public TreeWindow(String windowName) {
 this.subTree = new ArrayList<>();
 this.windowName = windowName;
    }

 @Override
 public void draw() {
        System.out.println("開始渲染:WinForm("+windowName+")");
 for (ViewTree viewTree : subTree){
            viewTree.draw();
        }
    }

 public void addSub(ViewTree viewTree){
        subTree.add(viewTree);
    }
}
           

定義圖檔元件類:

public class TreePicture implements ViewTree {

    private String pictureName;

    public TreePicture(String pictureName) {
        this.pictureName = pictureName;
    }

    @Override
    public void draw() {
        System.out.println("開始渲染:Picture("+pictureName+")");
    }
}
           

定義Botton元件類:

public class TreeButton implements ViewTree {

 private String buttonName;

 public TreeButton(String buttionName) {
 this.buttonName = buttionName;
    }

 @Override
 public void draw() {
        System.out.println("開始渲染:Buttion("+ buttonName +")");
    }
}
           

定義Frame元件類:

public class TreeFrame implements ViewTree {

 private String frameName;

 private List<ViewTree> subTree;

 public TreeFrame(String frameName) {
 this.frameName = frameName;
 this.subTree = new ArrayList<>();
    }

 @Override
 public void draw() {
        System.out.println("開始渲染:Frame("+ frameName +")");
 for (ViewTree viewTree : subTree){
            viewTree.draw();
        }
    }

 public void addSub(ViewTree viewTree){
        subTree.add(viewTree);
    }
}
           

定義Lable元件類:

public class TreeLable implements ViewTree {

 private String lableName;

 public TreeLable(String lableName) {
 this.lableName = lableName;
    }

 @Override
 public void draw() {
        System.out.println("開始渲染:Lable("+ lableName +")");
    }
}
           

定義TextBox元件類:

public class TreeTextBox implements ViewTree {

 private String textBoxName;

 public TreeTextBox(String textBoxName) {
 this.textBoxName = textBoxName;
    }

 @Override
 public void draw() {
        System.out.println("開始渲染:TextBox("+ textBoxName +")");
    }
}
           

定義PasswordBox元件類:

public class TreePasswordBox implements ViewTree {

 private String passwordBoxName;

 public TreePasswordBox(String passwordBoxName) {
 this.passwordBoxName = passwordBoxName;
    }

 @Override
 public void draw() {
        System.out.println("開始渲染:PasswordBox("+ passwordBoxName +")");
    }
}
           

定義CheckBox元件類:

public class TreeCheckBox implements ViewTree {

 private String checkBoxName;

 public TreeCheckBox(String checkBoxName) {
 this.checkBoxName = checkBoxName;
    }

 @Override
 public void draw() {
        System.out.println("開始渲染:CheckBox("+ checkBoxName +")");
    }
}
           

定義LinkLable元件類:

public class TreeLinkLable implements ViewTree {

 private String linkLableName;

 public TreeLinkLable(String linkLableName) {
 this.linkLableName = linkLableName;
    }

 @Override
 public void draw() {
        System.out.println("開始渲染:LinkLable("+ linkLableName +")");
    }
}
           

最後定義Main類,組裝視窗:

public class Main {
 public static void main(String[] args){
 //初始化視窗
        TreeWindow window = new TreeWindow("WINDOW視窗");

 //window添加元件
        TreePicture picture = new TreePicture("LOGO圖檔");
        TreeButton login = new TreeButton("登入");
        TreeButton register = new TreeButton("注冊");
        TreeFrame frame = new TreeFrame("FRAME1");
        window.addSub(picture);
        window.addSub(login);
        window.addSub(register);
        window.addSub(frame);

 //frame添加元件
        TreeLable userNameLable = new TreeLable("使用者名");
        TreeTextBox userNameBox = new TreeTextBox("文本框");
        TreeLable passwordLable = new TreeLable("密碼");
        TreePasswordBox passwordBox = new TreePasswordBox("密碼框");
        TreeCheckBox checkBox = new TreeCheckBox("複選框");
        TreeTextBox rememberUserNameBox = new TreeTextBox("記住使用者名");
        TreeLinkLable linkLable = new TreeLinkLable("忘記密碼");
        frame.addSub(userNameLable);
        frame.addSub(userNameBox);
        frame.addSub(passwordLable);
        frame.addSub(passwordBox);
        frame.addSub(checkBox);
        frame.addSub(rememberUserNameBox);
        frame.addSub(linkLable);

 //開始渲染
        window.draw();
    }
}
           

控制台輸入:

開始渲染:WinForm(WINDOW視窗)
開始渲染:Picture(LOGO圖檔)
開始渲染:Buttion(登入)
開始渲染:Buttion(注冊)
開始渲染:Frame(FRAME1)
開始渲染:Lable(使用者名)
開始渲染:TextBox(文本框)
開始渲染:Lable(密碼)
開始渲染:PasswordBox(密碼框)
開始渲染:CheckBox(複選框)
開始渲染:TextBox(記住使用者名)
開始渲染:LinkLable(忘記密碼)
           

好了,關于利用組合模式優雅的實作樹狀結構的全部内容就到這裡結束了,感謝閱讀。