在程式設計實踐中,經常會遇到樹狀結構的場景,比如我們的浏覽器視窗,比如檔案系統。
那麼,在處理樹狀結構的時候有什麼較好的方式呢?
現在,我們就來學習一種利用組合模式的方法。
如上圖所示,我們通過程式輸出的方式模拟視窗渲染的過程。
下面直接上代碼,首先定義一個接口,所有的元件都需要實作這個接口。
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(忘記密碼)
好了,關于利用組合模式優雅的實作樹狀結構的全部内容就到這裡結束了,感謝閱讀。