设计模式-组合模式

树枝和树干组成了树,就用树枝和树干来讲解一下组合模式。

一个组合模式有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)访问所有数据结构,

上一篇:怎么在大学当院系负责人呢?一个case study


下一篇:最通俗易懂的Redis发布订阅及代码实战