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

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

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

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

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

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;}@Overridepublic 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;}@Overridepublic void draw() {System.out.println("开始渲染:Picture("+pictureName+")");}
}

定义Botton组件类:

public class TreeButton implements ViewTree {private String buttonName;public TreeButton(String buttionName) {this.buttonName = buttionName;}@Overridepublic 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<>();}@Overridepublic 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;}@Overridepublic void draw() {System.out.println("开始渲染:Lable("+ lableName +")");}
}

定义TextBox组件类:

public class TreeTextBox implements ViewTree {private String textBoxName;public TreeTextBox(String textBoxName) {this.textBoxName = textBoxName;}@Overridepublic void draw() {System.out.println("开始渲染:TextBox("+ textBoxName +")");}
}

定义PasswordBox组件类:

public class TreePasswordBox implements ViewTree {private String passwordBoxName;public TreePasswordBox(String passwordBoxName) {this.passwordBoxName = passwordBoxName;}@Overridepublic void draw() {System.out.println("开始渲染:PasswordBox("+ passwordBoxName +")");}
}

定义CheckBox组件类:

public class TreeCheckBox implements ViewTree {private String checkBoxName;public TreeCheckBox(String checkBoxName) {this.checkBoxName = checkBoxName;}@Overridepublic void draw() {System.out.println("开始渲染:CheckBox("+ checkBoxName +")");}
}

定义LinkLable组件类:

public class TreeLinkLable implements ViewTree {private String linkLableName;public TreeLinkLable(String linkLableName) {this.linkLableName = linkLableName;}@Overridepublic 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(忘记密码)

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

实现树状结构_组合模式 - 树状结构的优雅实现相关推荐

  1. 组合模式Composite——树形结构不再头疼

    组合模式可以在需要针对"树形结构"进行操作的应用中使用,例如扫描文件夹.渲染网站导航结构等等. 一.什么是组合模式? 组合模式将一组相似的对象看做一个对象处理,并根据一个树状结构来 ...

  2. java设计模式用组合模式实现树形结构

    现有如下需求,某公司的机构: +公司 +分公司 +本地分公司 -呼和浩特 +包头 -昆区办事处 -青山办事处 +外地分公司 +总部 -人事处 +办公室 +财务处 实现思路: 抽象组合类,叶子类,根类 ...

  3. java设计模式(结构)--组合模式装饰器模式

    一.组合模式 用途:将对象组合成树形结构以表示 "部分--整体" 的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 案例:在中文中,一句话是由词语组成的 ...

  4. python智慧树判断题_知到智慧树_Python程序设计基础_判断题答案

    知到智慧树_Python程序设计基础_判断题答案 更多相关问题 [问答题,简答题] 简述安全门升压试验的方法. [问答题,简答题] 简述热力除氧的基本条件. [问答题,简答题] 简答汽轮机组停机后造成 ...

  5. b树范围查找_使用段树查找最大查询范围

    b树范围查找 The following question/problem is asked on http://www.spoj.com/problems/GSS1/ 在http://www.spo ...

  6. python程序的循环结构_四、python程序结构之循环结构

    循环结构的应用场景 如果在程序中我们需要重复的执行某条或某些指令,例如用程序控制机器人踢足球,如果机器人持球而且还没有进入射门范围,那么我们就要一直发出让机器人向球门方向奔跑的指令.当然你可能已经注意 ...

  7. jvm内存结构_浅谈JVM内存结构

    JVM 可以分为 5 个部分,分别是: 类加载器(Class Loader):加载字节码文件到内存. 运行时数据区(Runtime Data Area):JVM 核心内存空间结构模型. 执行引擎(Ex ...

  8. mapgis中6.7属性结构_不知道如何组织项目结构,这个项目也许可以给你启发

    大家好,我是欧盆索思(opensource),每天为你带来优秀的开源项目! 现在流行全栈.什么是全栈?一般指一个人同时把服务端和前端(或客户端)都搞定.今天推荐的这个项目,适合 Go 全栈程序员,它能 ...

  9. 广义表头尾链表存储结构_单向循环链表的存储结构和操作

    单向循环链表的存储结构 单向循环链表(Circular Linked List)是单向链表的一种扩充,当单向链表带有头结点时,把单向链表中尾结点的指针域由空指针改为头结点的指针(当单向链表不带头结点时 ...

最新文章

  1. 在一个成熟的分布式系统中 如何下手做高可用?
  2. STORM_0001_用vmware拷贝出三个相同的ubuntu搭建小的zookeeper集群
  3. JS原型继承和类式继承
  4. 结构体位域及联合体解析
  5. .net framework 2.0 Silent install(.net framework 静默安装)
  6. 25个优秀的设计机构网站设计案例
  7. JNI的方式调用DLL(SO)(上)
  8. JDK源码(17)-Compiler
  9. python编程入门到实践笔记-python基础(《Python编程:从入门到实践》读书笔记)...
  10. 一文带你了解推荐系统常用模型及框架
  11. 大疆的这个可编程教育机器人,可真不是个一般的机器人
  12. [ExtJS] Tpl模板中的extjs控件无法失焦处理
  13. 电子书籍制作工具软件大全
  14. 8则励志小故事,真正的心灵鸡汤
  15. JS随机漂浮广告代码
  16. 51单片机下载完程序后不亮_为什么要学习单片机?如何开始上手学习单片机?...
  17. 窗口DEA及matlab应用,文后有网盘链接
  18. excel 打印预览只能显示一页 打印的字特别小
  19. 小白兔写话_小学二年级期末写话片段练习 可爱的小白兔
  20. 生物多样性数据:中国物种体内污染物含量数据集,可用于评估物种生存风险,55297条

热门文章

  1. 【MaxCompute学习】隐式转化的问题
  2. 老王的心路历程(二):下一站Web体验监控产品
  3. redis入门笔记(1)
  4. C#的未来:扩展属性及更多
  5. Java知多少(18)类的定义及其实例化
  6. chrome调试、移动端调试
  7. 装箱(Boxing)和拆箱(Unboxing)
  8. C/C++学习笔记:算法知识之平衡树学习笔记,收藏一波吧!
  9. 程序员谈谈我的职场观(一)
  10. 『飞秋』在.NET 4中调用GDAL库时遇到的问题及解决方法