集約(Aggregation)

集約は,部分のオブジェクトが集まって全体のオブジェクトを構成している関係を指す.全体のオブジェクトがなくなっても,部分はそれ自体で存在することができる.

集約の関係は,Javaのコードにおいては,クラスのフィールドとして宣言されることで関係づけられる.「関連」と「集約」と「合成」の中では,「関連」の一サブクラスである.「合成」よりは結びつきは弱いが,「関連」よりは,結びつきが強い.全体のクラスがなくなっても,部分のクラスとして存在する.

DesktopPCクラスがDisplayクラスやKeyboardクラスを「持っている」という表現ができるので,「has-a」関係と呼ぶことがある.全体における部分という意味で「part-of関係」と呼ぶこともある.

「全体」 has-a 「部分」という表現ができる.今の例でいうと,「DesptopPC」 has-a 「Display」と表現することができる.これは「部分」part-of「全体」という表現もできる.すなわち「Display」part-of「DesktopPC」となる.

public class DesktopPC
{
    Display display;
    Mouse mouse;
    Keyboard keyboard;
    DesktopPC()
    {
  System.out.println("Desktop PC");
    }
    public void setup()
    {
        display = new Display();
        mouse = new Mouse();
        keyboard = new Keyboard();
    }
    public void initialize()
    {
        display.check();
        mouse.check();
        keyboard.check();
    }
}
public class Display
{
    private boolean status;
    Display()
    {
        status = false;
        switchButton();
    }
    public void switchButton()
    {
        if(status)
        {
            status = false;
            System.out.println("Display  Switch off");
        }
        else
        {
            status = true;
            System.out.println("Display Switch on");
        }
    }
    public void check()
    {
        if(status)
        {
            System.out.println("Display status success");
        }
        else
        {
            System.out.println("Display  status fail");
        }
    }
}
public class Keyboard
{
    private boolean status;
    Keyboard()
    {
        status = false;
        switchButton();
    }
    public void switchButton()
    {
        if(status)
        {
            status = false;
            System.out.println("Keyboard switch off");
        }
        else
        {
            status = true;
            System.out.println("Keyboard switch on");
        }
    }
    public void check()
    {
        if(status)
        {
            System.out.println("Keyboard status Success");
        }
        else
        {
            System.out.println("Keyboard status Fail");
        }
    }
}
public class Mouse
{
    private boolean status;
    Mouse()
    {
        status = false;
        switchButton();
    }
    public void switchButton()
    {
        if(status)
        {
            status = false;
            System.out.println("Mouse switch off");
        }
        else
        {
            status = true;
            System.out.println("Mouse switch on");
        }
    }
    public void check()
    {
        if(status)
        {
            System.out.println("Mouse status Success");
        }
        else
        {
            System.out.println("Mouse status Fail");
        }
    }
}
public class Main
{
    public static void main(String args[])
    {
        System.out.println("デスクトップPC作るよ");
        DesktopPC iMoc = new DesktopPC();
        System.out.println("セットアップするよ");//
        iMoc.setup();
        System.out.println("立ち上げるよ");//
        iMoc.initialize();
    }
}

実行した結果は以下となる.

デスクトップPC作るよ
Desktop PC
セットアップするよ
Display Switch on
Mouse switch on
Keyboard switch on
立ち上げるよ
Display status success
Mouse status Success
Keyboard status Success