到百度搜了一下,发现讲JAVA中的组合模式不少,但是发现基本都是代码讲解,说不清楚组合模式的真正意思,正好趁这段时间没什么事情,把书上说的结合自己的观点给大家用文字来说明一下。如果有不足之处还请大家给出意见。下面就开始讲讲JAVA中的组合模式。
一般设计人员经常将组件组织到层次结构化的结构中(比如说文件系统中的目录和文件层次结构),结构中的每个节点都代表一个组件(比如文件又或是目录)。每个节点都可以包含其他节点的引用。如果某个节点包含一个或多个其他节点的引用,则该节点称为分支(branch,例如:一个包含N个文件的目录)。如果某个节点不包含另一个节点的引用,则该节点称为叶(leaf,例如:一个文件)。有时:一个结构包含几个不同类的对象(目录可以包含文件和子目录)。在对象(称为客户)希望遍历结构时,该客户必须确定各个节点的特定类。进行这种确定工作不仅造成时间的浪费,而且将使该结构变的难以维护。
在组合设计模式中,层次结构中的各个组件均实现同一个接口,或扩展同一个超类。这种多态性确保客户能够以统一的方式遍历这个结构的所有的元素(分支或叶)。通过使用这种模式,客户在遍历结构时不必确定各个组件的类型,因为所有的组件均实现同一个接口,或者扩展同一个超类。
Java GUI组件就是采用了组合设计模式。以Swing组件的JPanel类为例,该类扩展JComponent类,而JComponent类扩展了java.awt.Container类,该类又扩展了java.awt.Component类(参考下面的图说明),Container类提供了add方法,该方法将一个Component对象(或是Component的子类对象)添加到Container对象中。因此呢JPanel对象可以添加到Component子类的任何对象中,而Component子类的任何对象也可以添加到JPanel对象中。JPanel对象在不知道组件的特定类型的情况下仍可以包含任何GUI组件。几乎所有的GUI类既是容器,也是组件,因此GUI能够具有任何复杂性的嵌套层次和结构。
客户(如JPanel对象)能以统一的方式遍历层次结构中的所有组件。例如:如果JPanel对象调用超类Container的repaint方法,则repaint方法将显示该JPanel对象及其所包含的所有组件。repaint方法不必确定每个组件的类型,因为所有组件均继承超类Container,而该类包含repaint方法。
screen.width-500)this.style.width=screen.width-500;" border="0" />
一般设计人员经常将组件组织到层次结构化的结构中(比如说文件系统中的目录和文件层次结构),结构中的每个节点都代表一个组件(比如文件又或是目录)。每个节点都可以包含其他节点的引用。如果某个节点包含一个或多个其他节点的引用,则该节点称为分支(branch,例如:一个包含N个文件的目录)。如果某个节点不包含另一个节点的引用,则该节点称为叶(leaf,例如:一个文件)。有时:一个结构包含几个不同类的对象(目录可以包含文件和子目录)。在对象(称为客户)希望遍历结构时,该客户必须确定各个节点的特定类。进行这种确定工作不仅造成时间的浪费,而且将使该结构变的难以维护。
在组合设计模式中,层次结构中的各个组件均实现同一个接口,或扩展同一个超类。这种多态性确保客户能够以统一的方式遍历这个结构的所有的元素(分支或叶)。通过使用这种模式,客户在遍历结构时不必确定各个组件的类型,因为所有的组件均实现同一个接口,或者扩展同一个超类。
Java GUI组件就是采用了组合设计模式。以Swing组件的JPanel类为例,该类扩展JComponent类,而JComponent类扩展了java.awt.Container类,该类又扩展了java.awt.Component类(参考下面的图说明),Container类提供了add方法,该方法将一个Component对象(或是Component的子类对象)添加到Container对象中。因此呢JPanel对象可以添加到Component子类的任何对象中,而Component子类的任何对象也可以添加到JPanel对象中。JPanel对象在不知道组件的特定类型的情况下仍可以包含任何GUI组件。几乎所有的GUI类既是容器,也是组件,因此GUI能够具有任何复杂性的嵌套层次和结构。
客户(如JPanel对象)能以统一的方式遍历层次结构中的所有组件。例如:如果JPanel对象调用超类Container的repaint方法,则repaint方法将显示该JPanel对象及其所包含的所有组件。repaint方法不必确定每个组件的类型,因为所有组件均继承超类Container,而该类包含repaint方法。
screen.width-500)this.style.width=screen.width-500;" border="0" />
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7178747/viewspace-160928/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7178747/viewspace-160928/