Java 设计模式之组合模式的详解(结构模式)
2016-07-31 13:17
597 查看
组合模式(Composite)就是把部分和整体的关系用树形的结构来表示,从而使客户端能够把部分对象和组合起来的对象采用同样的方式来看待。
树图结构一般包含一个根节点,若干个树枝和叶子节点。如下图:
可以用一个类图描述树结构的静态结构,把根节点当做树枝节点来描述,同时和叶子节点具有共同的父类:
树结构的类图,其实就是组合模式的简略类图,最上面为抽象节点,左下方为叶子节点,右下方为树枝节点,它含有其他的节点。
通过以上结构图可以看出,组合模式有以下角色:
1、抽象构建角色(component):作为抽象角色,给组合对象的统一接口。
2、树叶构建角色(leaf):代表组合对象中的树叶对象。
3、树枝构建角色(composite):参加组合的所有子对象的对象,并给出树枝构构建对象的行为。
组合模式在现实中使用很常见,比如文件系统中目录和文件的组成,算式运算,android里面的view和viewgroup等控件,淘宝产品分类信息的展示等都是组合模式的例子。
还有个故事:从前山里有座庙,庙里有个老和尚,老和尚对象小和尚讲故事说,从前山里有个庙......退出循环的条件是听厌烦了,或者讲的人讲累了。
这个模式的举例最多的是公司员工的例子。我们这里也以故事雇员为例子来描述:
实例代码:
抽象构建角色:
public interface Worker {
public abstract void doSomething();
}
树叶构建角色:
public class Employe implements Worker{
private String name;
public Employe(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "我叫"+getName()+",就一普通员工!";
}
@Override
public void doSomething() {
// TODO Auto-generated method stub
System.out.println(toString());
}
}树枝构建角色:
public class Leader implements Worker {
private List<Worker> workers = new ArrayList<Worker>();
private String name;
public Leader(String name) {
super();
this.name = name;
}
public void add(Worker worker) {
workers.add(worker);
}
public void remove(Worker worker) {
workers.remove(worker);
}
public Worker getChild(int i) {
return workers.get(i);
}
@Override
public void doSomething() {
System.out.println(toString());
Iterator<Worker> it = workers.iterator();
while (it.hasNext()) {
it.next().doSomething();
}
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "我叫" + getName() + ", 我是一个领导,有 " + workers.size() + "下属。";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
测试类:
public class Te {
public static void main(String[] args) {
// TODO Auto-generated method stub
Leader leader1 = new Leader("张三");
Leader leader2 = new Leader("李四");
Employe employe1 = new Employe("王五");
Employe employe2 = new Employe("赵六");
Employe employe3 = new Employe("陈七");
Employe employe4 = new Employe("徐八");
leader1.add(leader2);
leader1.add(employe1);
leader1.add(employe2);
leader2.add(employe3);
leader2.add(employe4);
leader1.doSomething();
}
}测试结果为:
上面员工关系的的树形结构如下:
上面例子给出的组合模式抽象角色里,并没有管理子节点的方法,而是在树枝构建角色,这种模式使得叶子构建角色和树枝构建角色有区分,客户端要分别对待树叶构建角色和树枝构建角色,好处是客户端对叶子节点不会调用管理的方法,当调用时,在编译时就会报错,所以也称安全模式。相对安全模式,还有一种透明模式,就是在抽象角色里面添加管理方法,如下图:
这种做法是对客户端来说叶子和树枝都是一致的接口,相对透明,但是叶子节点在调用管理方法是编译时不会报错,运行时才报错,所以不够安全。两种做法均有利弊,使用时要根据具体情况而权衡。
树图结构一般包含一个根节点,若干个树枝和叶子节点。如下图:
可以用一个类图描述树结构的静态结构,把根节点当做树枝节点来描述,同时和叶子节点具有共同的父类:
树结构的类图,其实就是组合模式的简略类图,最上面为抽象节点,左下方为叶子节点,右下方为树枝节点,它含有其他的节点。
通过以上结构图可以看出,组合模式有以下角色:
1、抽象构建角色(component):作为抽象角色,给组合对象的统一接口。
2、树叶构建角色(leaf):代表组合对象中的树叶对象。
3、树枝构建角色(composite):参加组合的所有子对象的对象,并给出树枝构构建对象的行为。
组合模式在现实中使用很常见,比如文件系统中目录和文件的组成,算式运算,android里面的view和viewgroup等控件,淘宝产品分类信息的展示等都是组合模式的例子。
还有个故事:从前山里有座庙,庙里有个老和尚,老和尚对象小和尚讲故事说,从前山里有个庙......退出循环的条件是听厌烦了,或者讲的人讲累了。
这个模式的举例最多的是公司员工的例子。我们这里也以故事雇员为例子来描述:
实例代码:
抽象构建角色:
public interface Worker {
public abstract void doSomething();
}
树叶构建角色:
public class Employe implements Worker{
private String name;
public Employe(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "我叫"+getName()+",就一普通员工!";
}
@Override
public void doSomething() {
// TODO Auto-generated method stub
System.out.println(toString());
}
}树枝构建角色:
public class Leader implements Worker {
private List<Worker> workers = new ArrayList<Worker>();
private String name;
public Leader(String name) {
super();
this.name = name;
}
public void add(Worker worker) {
workers.add(worker);
}
public void remove(Worker worker) {
workers.remove(worker);
}
public Worker getChild(int i) {
return workers.get(i);
}
@Override
public void doSomething() {
System.out.println(toString());
Iterator<Worker> it = workers.iterator();
while (it.hasNext()) {
it.next().doSomething();
}
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "我叫" + getName() + ", 我是一个领导,有 " + workers.size() + "下属。";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
测试类:
public class Te {
public static void main(String[] args) {
// TODO Auto-generated method stub
Leader leader1 = new Leader("张三");
Leader leader2 = new Leader("李四");
Employe employe1 = new Employe("王五");
Employe employe2 = new Employe("赵六");
Employe employe3 = new Employe("陈七");
Employe employe4 = new Employe("徐八");
leader1.add(leader2);
leader1.add(employe1);
leader1.add(employe2);
leader2.add(employe3);
leader2.add(employe4);
leader1.doSomething();
}
}测试结果为:
上面员工关系的的树形结构如下:
上面例子给出的组合模式抽象角色里,并没有管理子节点的方法,而是在树枝构建角色,这种模式使得叶子构建角色和树枝构建角色有区分,客户端要分别对待树叶构建角色和树枝构建角色,好处是客户端对叶子节点不会调用管理的方法,当调用时,在编译时就会报错,所以也称安全模式。相对安全模式,还有一种透明模式,就是在抽象角色里面添加管理方法,如下图:
这种做法是对客户端来说叶子和树枝都是一致的接口,相对透明,但是叶子节点在调用管理方法是编译时不会报错,运行时才报错,所以不够安全。两种做法均有利弊,使用时要根据具体情况而权衡。
相关文章推荐
- Java 设计模式之装饰模式的详解(结构模式)
- Java开发中的23种设计模式详解(2)结构型
- Java与设计模式(十八)结构型--组合模式
- Java 设计模式之代理模式的详解(结构模式)
- java23中设计模式——结构模式——Composite(组合) 3ff8
- JAVA设计模式(10):结构型-组合模式(Composite)
- JAVA设计模式之组合模式原理与用法详解
- 【GOF23设计模式】_组合模式_树状结构_杀毒软件架构_JUnite底层架构JAVA239
- Java 设计模式之桥接模式的详解(结构模式)
- Java开发中的23种设计模式详解----组合模式(Composite)
- Java 设计模式之享元模式的详解(结构模式)
- Java 中组合模型之对象结构模式的详解
- java 设计模式之外观模式的详解(结构模式)
- Java 设计模式之适配器模式的详解(结构模式)
- 详解Java设计模式编程中的Flyweight享元模式的开发结构
- 设计模式--结构模式--组合模式--Java
- 详解Java设计模式编程中命令模式的项目结构实现
- Java IO详解(两种设计模式的分析)
- Java中23种设计模式详解
- java软件体系结构设计模式-------对象缓存器