组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
简单描述:1个Composite类,里面持有一个容器成员,容器可以存入自身
大话设计模式中的截图:
代码例子:
AbstractComponent类:
1 package com.longsheng.composite;
2
3 public abstract class AbstractComponent {
4
5 public abstract void addComp(AbstractComponent mAbstractComponent);
6
7 public abstract void removeComp(AbstractComponent mAbstractComponent);
8
9 public abstract void display(int depth);
10
11 }
Component类:
1 package com.longsheng.composite;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 public class Component extends AbstractComponent {
7
8 private List<AbstractComponent> container = new ArrayList<AbstractComponent>();
9 private String name;
10
11 public Component(String name) {
12 this.name = name;
13 }
14
15 @Override
16 public void addComp(AbstractComponent mAbstractComponent) {
17 if(mAbstractComponent != null && mAbstractComponent == this) {
18 return;//不能添加自己否则会形成死循环
19 }
20 container.add(mAbstractComponent);
21 }
22
23 @Override
24 public void removeComp(AbstractComponent mAbstractComponent) {
25 if( mAbstractComponent != null && mAbstractComponent == this ) {
26 return;
27 }
28 container.remove(mAbstractComponent);
29 }
30
31 @Override
32 public void display(int depth) {
33 String temp = "";
34 for (int i = 0; i < depth; i++) {
35 temp += "-";
36 }
37 System.out.println(temp + name);
38 for (AbstractComponent mComponent : container) {
39 mComponent.display(depth + 2);
40 }
41 }
42
43 }
Leaf类:
1 package com.longsheng.composite;
2
3 public class Leaf extends AbstractComponent {
4
5 private String name;
6
7 public Leaf( String name ) {
8 this.name = name;
9 }
10
11 @Override
12 public void addComp(AbstractComponent mAbstractComponent) {
13 }
14
15 @Override
16 public void removeComp(AbstractComponent mAbstractComponent) {
17 }
18
19 @Override
20 public void display(int depth) {
21 String temp = "";
22 for (int i = 0; i < depth; i++) {
23 temp += "-";
24 }
25 System.out.println(temp + name);
26 }
27
28 }
客户端:
1 package com.longsheng.composite;
2
3 public class Client {
4
5 public static void main(String args[]) {
6 Component mRoot = new Component("总公司");
7 Leaf mRootHR = new Leaf("总公司人力资源部");
8 Leaf mRootFinance = new Leaf("总公司财务部");
9 mRoot.addComp(mRootHR);
10 mRoot.addComp(mRootFinance);
11
12 Component mSub = new Component("华东分公司");
13 Leaf mSubHR = new Leaf("华东分公司人力资源部");
14 Leaf mSubFinance = new Leaf("华东分公司财务部");
15 mSub.addComp(mSubHR);
16 mSub.addComp(mSubFinance);
17
18 Component mNanjing = new Component("南京分公司");
19 Leaf mNanjingHR = new Leaf("南京分公司人力资源部");
20 Leaf mNanjingFinance = new Leaf("南京分公司财务部");
21 mNanjing.addComp(mNanjingHR);
22 mNanjing.addComp(mNanjingFinance);
23
24 Component mHangzhou = new Component("杭州分公司");
25 Leaf mHangzhouHR = new Leaf("杭州分公司人力资源部");
26 Leaf mHangzhouFinance = new Leaf("杭州分公司财务部");
27 mHangzhou.addComp(mHangzhouHR);
28 mHangzhou.addComp(mHangzhouFinance);
29
30 mRoot.addComp(mSub);
31 mSub.addComp(mNanjing);
32 mSub.addComp(mHangzhou);
33
34 mRoot.display(0);
35 }
36
37 }
运行结果:
1 总公司
2 --总公司人力资源部
3 --总公司财务部
4 --华东分公司
5 ----华东分公司人力资源部
6 ----华东分公司财务部
7 ----南京分公司
8 ------南京分公司人力资源部
9 ------南京分公司财务部
10 ----杭州分公司
11 ------杭州分公司人力资源部
12 ------杭州分公司财务部
Leaf类可以不必继承AbstractComponent类,以和树枝节点区分开,这需要在具体业务中进行选择。
这个模式在图形控件中经常使用,如在Android中,ViewGroup是View的子类,ViewGroup可以装入View;在Java—AWT中,JPanel是一个Component,同时有个add方法可以装入Component
时间: 2024-12-15 06:43:52