設(shè)計(jì)模式第6篇:復(fù)合模式

本文翻譯自:https://www.journaldev.com/1535/composite-design-pattern-in-java

Composite Design Pattern in Java

這種模式是基于具有共同行為的多個(gè)對(duì)象的存在,用于構(gòu)建更大的對(duì)象。較大的對(duì)象仍然具有與最小對(duì)象相同的特征。

讓我們用一個(gè)真實(shí)生活案例來解釋:一個(gè)圖表是用圓、直線、長(zhǎng)方形等構(gòu)成。當(dāng)我們用顏料來畫畫的時(shí)候,相同的顏色會(huì)被重復(fù)使用,畫圖的過程是一個(gè)重復(fù)的過程,里面的一些操作是相同的;

復(fù)合模式由以下幾個(gè)方面構(gòu)成:

  • Base Component:Base Component是所有對(duì)象的接口,它可以是一個(gè)抽象類或interface;
  • Leaf : 定義了元素的行為,實(shí)現(xiàn)了Base Component,并與其他組件無引用關(guān)系;
  • Composite : 由Leaf 構(gòu)成,實(shí)現(xiàn)了Base Component中的操作方法;

接下來使用一個(gè)畫畫的例子來例證:

Base Component

復(fù)合模式的Base Component為L(zhǎng)eaf和Composites 定義了一些普通的方法,我們可以創(chuàng)建一個(gè)Shape類,包含一個(gè)draw(String fillColor) 方法,其可以指定顏色;

Shape.java

package com.journaldev.design.composite;

public interface Shape {
    
    public void draw(String fillColor);
}

Leaf Objects

Leaf實(shí)現(xiàn)了Base Component接口,它是Composite的構(gòu)建區(qū)塊,我們可以創(chuàng)建多個(gè)Leaf,比如Triangle、Circle;

Triangle.java

package com.journaldev.design.composite;

public class Triangle implements Shape {

    @Override
    public void draw(String fillColor) {
        System.out.println("Drawing Triangle with color "+fillColor);
    }

}

Circle.java

package com.journaldev.design.composite;

public class Circle implements Shape {

    @Override
    public void draw(String fillColor) {
        System.out.println("Drawing Circle with color "+fillColor);
    }

}

Composite object

Composite 包含了一組Leaf組件,所以在Composite 內(nèi)部提供了一些add和delete方法來增加或刪除Leaf組件,也可以提供remove all將所有Leaf刪除。

Drawing.java

package com.journaldev.design.composite;

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

public class Drawing implements Shape{

    //collection of Shapes
    private List<Shape> shapes = new ArrayList<Shape>();
    
    @Override
    public void draw(String fillColor) {
        for(Shape sh : shapes)
        {
            sh.draw(fillColor);
        }
    }
    
    //adding shape to drawing
    public void add(Shape s){
        this.shapes.add(s);
    }
    
    //removing shape from drawing
    public void remove(Shape s){
        shapes.remove(s);
    }
    
    //removing all the shapes
    public void clear(){
        System.out.println("Clearing all the shapes from drawing");
        this.shapes.clear();
    }
}

Composite Design Pattern Client Program

然后對(duì)該模式進(jìn)行測(cè)試:TestCompositePattern.java

package com.journaldev.design.test;

import com.journaldev.design.composite.Circle;
import com.journaldev.design.composite.Drawing;
import com.journaldev.design.composite.Shape;
import com.journaldev.design.composite.Triangle;

public class TestCompositePattern {

    public static void main(String[] args) {
        Shape tri = new Triangle();
        Shape tri1 = new Triangle();
        Shape cir = new Circle();
        
        Drawing drawing = new Drawing();
        drawing.add(tri1);
        drawing.add(tri1);
        drawing.add(cir);
        
        drawing.draw("Red");
        
        drawing.clear();
        
        drawing.add(tri);
        drawing.add(cir);
        drawing.draw("Green");
    }

}

輸出:

Drawing Triangle with color Red
Drawing Triangle with color Red
Drawing Circle with color Red
Clearing all the shapes from drawing
Drawing Triangle with color Green
Drawing Circle with color Green

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容