设计模式-组合模式-以大学结构为例

介绍

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

其主要的作用是将一组相似对象可以以相同的接口进行操作,这样可以使客户端保持一致的处理这些对象,并且可以增加新对象的同时避免修改客户端代码,符合开闭原则。

组合模式结构

组合模式因为是树形结构,主要由三种结构组成

  1. 抽象构件(Component)角色:树的根节点,它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。
  2. 树枝构件(Composite)角色 :树的分支节点,它有子节点,需要继承及实现抽象构件的函数。它的主要作用是存储和管理子部件,因此通常包含 Add()、Remove()、GetChild() 等方法。
  3. 树叶构件(Leaf)角色:是组合中树的叶子节点对象,它没有子节点,用于继承或实现抽象构件,通常不包含Add()、Remove()、GetChild() 等方法。

案例

以大学为例,大学的组织结构简单化处理可能有以下几个部分,分别为学校,学院,年级,班级,按照常规的逻辑来思考,这是一个包含的关系,但是每个部分都可能会有自己的相关功能,如果我们将所有的部分都视为不同的对象,那么假如此时我们需要一个统筹管理整个学校各个部分的软件,则每个部分我们都需要调用对应的接口来管理。但是其实像一些内部的增删改查等,这几个部分的管理都是需要的,所以我们可以用组合模式将这几部分看作相同对象,提供相同的接口完成一些工作。

具体实现

抽象构件

定义公共方法

public interface Component {
    public void add(Component c);

    public void remove(Component c);

    public Component getChild(int i);
    public void showAllChild();
}

树枝构件

大学类

@Data
//大学类
public class University implements Component{
    String name;
    List<Component> componentList=new ArrayList<Component>();
    @Override
    public void add(Component c) {
        componentList.add(c);
    }
    public University(String name){
        this.name=name;
    }
    @Override
    public void remove(Component c) {
        componentList.remove(c);
    }

    @Override
    public Component getChild(int i) {
        if(i<componentList.size()){
            return componentList.get(i);
        }
        return null;
    }

    @Override
    public void showAllChild() {
        System.out.println("访问"+name);
        //递归访问所有子节点
        for (Object obj:componentList){
            ((Component) obj).showAllChild();
        }
    }
}

学院类

//学院类
@Data
public class College implements  Component{
    String name;
    List<Component> componentList=new ArrayList<Component>();
    //需要注意,并不是学校和学院的这些接口实现必须一致,相反,两者可能存在功能上的较大差异,完全可以是不同的实现,只是保持相同的对外接口
    @Override
    public void add(Component c) {
        componentList.add(c);
    }
    public College(String name){
        this.name=name;
    }
    @Override
    public void remove(Component c) {
        componentList.remove(c);
    }

    @Override
    public Component getChild(int i) {
        if(i<componentList.size()){
            return componentList.get(i);
        }
        return null;
    }

    @Override
    public void showAllChild() {
        System.out.println("访问"+name);
        //递归访问所有子节点
        for (Object obj:componentList){
            ((Component) obj).showAllChild();
        }
    }
}

树叶构件

年级类

@Data
//我这里代码简化了,把年级设为叶子节点,实际上年级下面还可能有层级
public class Grade implements Component{
    String name;
    //叶节点没有子节点,add,remove getChild不需要实现
    @Override
    public void add(Component c) {

    }
    public Grade(String name){
        this.name=name;
    }
    @Override
    public void remove(Component c) {

    }

    @Override
    public Component getChild(int i) {
        return null;
    }

    @Override
    public void showAllChild() {
        System.out.println("访问"+name);
    }
}

测试

 @Test
    public void test()
    {
        //创建组织结构
        Component university=new University("XX大学");
        Component college1=new College("XX学院");
        Component college2=new College("YY学院");
        Component grade1=new Grade("XX学院XX级");
        Component grade2=new Grade("XX学院YY级");
        Component grade3=new Grade("YY学院XX级");
        Component grade4=new Grade("YY学院YY级");
        college1.add(grade1);
        college1.add(grade2);
        college2.add(grade3);
        college2.add(grade4);
        university.add(college1);
        university.add(college2);
        university.showAllChild();
    }

测试结果

访问XX大学
访问XX学院
访问XX学院XX级
访问XX学院YY级
访问YY学院
访问YY学院XX级
访问YY学院YY级

总结

由上面案例可以看出,组合模式可以简化客户端操作,客户端只需要调用相同的接口就可以操作不同的对象,并且当新增加对象是客户端不需要修改代码。
同时可以看出在需要表示一个对象整体与部分的层次结构的场合或者遍历组织架构,或者处理的对象具有树形结构时非常适合组合模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java设计模式是一组经过实践验证的面向对象设计原则和模式,可以帮助开发人员解决常见的软件设计问题。下面是常见的23种设计模式: 1. 创建型模式(Creational Patterns): - 工厂方法模式(Factory Method Pattern) - 抽象工厂模式(Abstract Factory Pattern) -模式(Singleton Pattern) - 原型模式(Prototype Pattern) - 建造者模式(Builder Pattern) 2. 结构模式(Structural Patterns): - 适配器模式(Adapter Pattern) - 桥接模式(Bridge Pattern) - 组合模式(Composite Pattern) - 装饰器模式(Decorator Pattern) - 外观模式(Facade Pattern) - 享元模式(Flyweight Pattern) - 代理模式(Proxy Pattern) 3. 行为型模式(Behavioral Patterns): - 责任链模式(Chain of Responsibility Pattern) - 命令模式(Command Pattern) - 解释器模式(Interpreter Pattern) - 迭代器模式(Iterator Pattern) - 中介者模式(Mediator Pattern) - 备忘录模式(Memento Pattern) - 观察者模式(Observer Pattern) - 状态模式(State Pattern) - 策略模式(Strategy Pattern) - 模板方法模式(Template Method Pattern) - 访问者模式(Visitor Pattern) 4. 并发型模式(Concurrency Patterns): - 保护性暂停模式(Guarded Suspension Pattern) - 生产者-消费者模式(Producer-Consumer Pattern) - 读写锁模式(Read-Write Lock Pattern) - 信号量模式(Semaphore Pattern) - 线程池模式(Thread Pool Pattern) 这些设计模式可以根据问题的特点和需求来选择使用,它们提供了一些可复用的解决方案,有助于开发高质量、可维护且易于扩展的软件系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值