组合模式 - 树状结构的优雅实现

用户头像
hellohuan
关注
发布于: 2020 年 06 月 24 日
组合模式-树状结构的优雅实现

1 二话不说,先上一张手写代码

上图为利用内部静态类实现的单例模式,是一种比较优雅的单例模式。

2 树结构实现

开始进入我们的正题,在编程实践中,经常会遇到树状结构的场景,比如我们的浏览器窗口,比如文件系统。

那么,在处理树状结构的时候有什么较好的方式呢?

现在,我们就来学习一种利用组合模式的方法。

如上图所示,我们通过程序输出的方式模拟窗口渲染的过程。

下面直接上代码,首先定义一个接口,所有的组件都需要实现这个接口。

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(忘记密码)

好了,关于利用组合模式优雅的实现树状结构的全部内容就到这里结束了,感谢查阅。



发布于: 2020 年 06 月 24 日 阅读数: 31
用户头像

hellohuan

关注

活到老,学到老 2018.09.17 加入

从事互联网研发工作,对产品、运营充满兴趣,终身学习践行者

评论

发布
暂无评论
组合模式-树状结构的优雅实现