IT铁人DAY 13-Composite 组合模式

  今天要来介绍Composite Pattern,是属於Structural Design Pattern的其中之一,现在就来认识一下吧!


问题情境与解析

  假设现在有两种类型的物件,一个是物品、一个是包装盒,而包装盒中还可以容纳小的包装盒和一些物品,有点类似俄罗斯娃娃的样子。若要检查里面所有物品总价是多少,就必须要打开所有大小的包装盒来计数。

  在现实生活中,这方法看起来非常理所当然,不过在程序中,要这样运作就必须先知道盒子的类别,还要经历其繁琐的过程才能达到目的,这会显得程序看起来非常笨拙。

  而Composite模式会宣告一组物件,这些物件(物品、小包装盒)会有个共同的介面,这介面提供了一个计算总价的方法,若是物品就会回传该物品的价格;若是小盒子就会去遍历其内部组件的所有物品,并回传所有东西的总价。

  用这样的一种方式来达到不需要你要传递资讯的对象是一个物件还是小盒子,只要透过它们共同的介面,将它们一视同仁,在调用其方法的时候,物件本身就会将请求向下传递到各个节点中,做子结点自己该做的事情!就好比分配一个任务到主管身上,而主管就会去组织他的团队,向下布达本次任务,再由每个人各司其职,来完成团队任务!

Class Diagram

https://ithelp.ithome.com.tw/upload/images/20210928/20140743hvqnst0YbX.png

Skeleton Code

import java.util.ArrayList;
import java.util.List;

interface Component {
    public void execute();
}

class Leaf implements Component {
	private Type field;
	
    public Leaf(Type field) {
        this.field = field;
    }

    public void execute()
    {
        // Do some Work
    }
}

class Composite implements Component {
    private List<Component> children = new ArrayList<Component>();

    public void execute() {
        for(Component kid:children) {
            kid.execute();
        }
    }
			
    public void addComponent(Component kid) {
        children.add(kid);
    }

    public void removeComponent(Component kid) {
        children.remove(kid);
    }
}

  使用Composite Pattern就可以很方便的使用复杂的树状结构,透过共同的介面来完成复杂的任务,若要新增新的物件到程序码中,也可以不用修改主程序就能够新增树状结构的新结点了,是不是很方便呢!


除此之外,也欢迎大家走走逛逛关於我们团队夥伴的文章

lu23770127 - SASS 基础初学三十天

10u1 - 糟了!是世界奇观!

juck30808 - Python - 数位行销分析与 Youtube API 教学

SiQing47 - 前端?後端?你早晚都要全端的,何不从现在开始?


<<:  Day 16事件处理

>>:  Day13 Defer

隐藏&显示画面中间的某区块

缘由: 开发时或多或少会遇到因某个条件地达成,需要显示或隐藏画面中的另一个条件,若是区块在最底部,直...

Day21-Kubernetes 那些事 - Volume

前言 上一篇文章介绍了 ConfigMap 以及 Secrets 以及如何建立,接下来就要介绍如何正...

Day 11 实作 create_app

前言 前几天有提到在工厂模式中,我们会用一个函式把全部 app 生起来,今天要实作的就是这个函式,一...

Uniform - shader 之参数

大家好,我是西瓜,你现在看到的是 2021 iThome 铁人赛『如何在网页中绘制 3D 场景?从 ...

【27】遇到不平衡资料(Imbalanced Data) 时 使用 Undersampling 解决实验

Colab连结 不平衡资料集(Imbalanced Dataset) 指的是当你的资料集中,有某部分...