提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
本人对于设计模式的学习,仅供参考!
一、组合模式Composite
简介:
将对象组合成树形行结构,以表示“部分整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
他使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
组合模式可以让你优化处理递归或分级数据结构。分级数据的一个普遍例子,如使用电脑时遇到的系统文件由文件夹和文件组成,文件夹中又可以包含文件夹。按这种方式文件系统就是以递归结构来组织的。想描述这样的结构就可以使用组合模式Composite。
组合模式主要包含以下主要角色:
1.抽象构建角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现他们的默认行为。在透明式的组合模式中,抽象构建还声明访问和管理子类的接口。
2.树叶构建角色:是组合中的叶节点对象,他没有子节点,用于继承或实现抽象构建。
3.树枝结构角色:是组合中的分支节点对象,他有子节点(子节点可以是树叶构建、可以是树枝构建),用于继承或实现抽象构建。
二、代码实现
代码如下(示例):
//抽象构建角色
public interface Node {
void desc();
}
//树枝结构角色
public class Branch implements Node {
private String name;
//子节点集合
private List<Node>nodes=new ArrayList<>();
public List<Node> getNodes() {
return nodes;
}
public Branch(String name) {
this.name = name;
}
//重写的业务代码
@Override
public void desc() {
System.out.println(name);
}
public void add(Node n){
this.nodes.add(n);
}
}
//树叶构件角色
public class Leaf implements Node {
private String content;
public Leaf(String content) {
this.content = content;
}
//重写的业务方法
@Override
public void desc() {
System.out.println(content);
}
}
public class Main {
public static void main(String[] args) {
/*构建树形节点的对象----------------------start----------------------*/
Branch root=new Branch("root");
Branch directory1=new Branch("d1");
Branch directory11=new Branch("d11");
Node file111=new Leaf("f111");
Branch directory12=new Branch("d12");
Node file121=new Leaf("f121");
Node file13=new Leaf("f13");
Branch directory2=new Branch("d2");
Branch directory21=new Branch("d21");
Node file211=new Leaf("f211");
Branch directory22=new Branch("d22");
Node file221=new Leaf("f221");
Node file23=new Leaf("f23");
Node file3=new Leaf("f3");
directory2.add(directory22);
directory2.add(directory21);
directory2.add(file23);
directory22.add(file221);
directory21.add(file211);
directory1.add(directory11);
directory1.add(directory12);
directory1.add(file13);
directory11.add(file111);
directory12.add(file121);
root.add(directory1);
root.add(directory2);
root.add(file3);
/*构建树形节点的对象----------------end-----------------------------*/
tree(root,0);
}
static void tree(Node b,int depth){
for (int i = 0; i < depth; i++) System.out.print("--");
b.desc();
if (b instanceof Branch){
for (Node node : ((Branch)b).getNodes()) {
tree(node,depth+1);
}
}
}
}
控制台:
root
--d1
----d11
------f111
----d12
------f121
----f13
--d2
----d22
------f221
----d21
------f211
----f23
--f3
Process finished with exit code 0
总结
优点:
1.清楚的定义分层次的复杂对象,表示对象的全部或部分层次。
2.让客户端忽略层次之间的差异,方便对整个层次结构进行控制。
3.简化客户端代码
缺点:
1.限制类型是比较复杂。
2.使设计变得更加抽象。