当一个类的定义中有递归出现时,就需要用到 composite 模式。
比如树。树的结点可以是叶子结点,也可以是另一棵子级树。也就是树是由子树(叶子可看成是退化的子树)构成的,出现的递归,所以使用 composite 模式。
想想马三立的相声《挠挠》,那个秘方可看成是退化了的 composite。
interface Openable
{
void Open();
}
class Script implements Openable // 纸条
{
public void Open()
{
System.out.println("挠挠\n");
}
}
public class Package implements Openable // 纸包
{
private Openable content;
public Package(Script s)
{
content = s;
}
public Package(Package p)
{
content = p;
}
public void Open()
{
System.out.print("打开一层纸包\n");
content.Open();
}
}
public class Secret implements Openable // 祖传秘方
{
private Openable secret;
public Secret()
{
secret = new Package(new Package(new Package(new Package(new Package(new Package(new Package(new Package(new Package(new Package(new Script()))))))))));
}
public void Open()
{
secret.Open();
}
}