树枝和树干组成了树,就用树枝和树干来讲解一下组合模式。
一个组合模式有3种角色,抽象构件,类似于树干,定义了基本方法;树枝构件,用于管理树叶;树叶构件,用于具体实现。
先来看一个例子
学生:
interface Student { void add(Student s); void remove(Student s); Student getStudent(int x); void study(); }
班级:
public class GradeOne implements Student { private String name; @Override public void add(Student s) { } @Override public void remove(Student s) { } @Override public Student getStudent(int x) { return null; } @Override public void study() { System.out.println(this.name+"在学习"); } public GradeOne(String name) { this.name = name; } }
一年级学生
public class GradeOne implements Student { private String name; @Override public void add(Student s) { } @Override public void remove(Student s) { } @Override public Student getStudent(int x) { return null; } @Override public void study() { System.out.println(this.name+"在学习"); } public GradeOne(String name) { this.name = name; } }
测试类
public class Client { public static void main(String[] args) { Monitor m1 = new Monitor(); Monitor m2 = new Monitor(); m1.add(new GradeOne("小明")); m1.add(new GradeOne("小红")); m1.add(new GradeOne("小黑")); m1.study(); } }
在这种模式下,多个学生组成了一个班级,班级有对学生的控制权,在该设计模式中,抽象构件声明了所有子类的方法,所以对于客户端来说都是同一个超类,无需区分对象,对客户端来说是同名的,这种叫做透明的组合模式。但是因为学生类没有具体的实现接口中的所有方法,需要空实现或者抛异常,可能会带来安全问题。
还有一种方法是安全的组合模式,接口只定义一个study方法,树叶只需要实现study方法,树枝添加对树叶的管理方法,这种组合方式就是安全的。
应用场景:需要隐藏组合对象和单个对象不同的时候可以使用此设计模式,对外只提供一个唯一的接口(study)访问所有数据结构,