์กฐ๊ธ ์์ ์ ๊ณต๋ถํ๋ ๋์์ธ ํจํด์ธ๋ฐ, ๋ค์ ๋ณต์ตํ๋ฉด์ ์ ๋ฆฌํด๋ณด์๋ค
๋์์ธ ํจํด๋ ์ฐพ์๋ณด๋ฉฐ ๊ฐ๋ฐํ๋ ์ด์ ์ด๋๊ฐ๋ ๐ฅน
Composite ๋ป
OOP์์ ์ปดํฌ์งํธ๋ ํ๋ ์ด์์ ์ ์ฌํ ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑ์ผ๋ก ์ค๊ณ๋ ๊ฐ์ฒด๋ก ๋ชจ๋ ์ ์ฌํ ๊ธฐ๋ฅ์ ๊ฐ์ง
๊ฐ์ฒด ๊ทธ๋ฃน์ ์กฐ์ํ๋ ๊ฒ ์ฒ๋ผ ๋จ์ผ ๊ฐ์ฒด๋ฅผ ์กฐ์ํ ์ ์์
Composite Pattern
ํด๋ผ์ด์ธํธ๊ฐ ๋ณตํฉ ๊ฐ์ฒด/๋จ์ผ ๊ฐ์ฒด๋ฅผ ๋์ผํ๊ฒ ์ทจ๊ธํ๋ ๊ฒ์ ๋ชฉ์ ์ผ๋ก ํจ
ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์์ฑ, ์ ์ฒด-๋ถ๋ถ ๊ด๊ณ ํํ
- ํธ๋ฆฌ๊ตฌ์กฐ๋ฅผ ๋ค๋ฃฐ ๋, ๊ฐ๋ฐ์๋ ๋ฆฌํ๋ ธ๋์ ๋ธ๋์น ๊ตฌ๋ณํด์ผํจ
- ๋ณต์กํ๊ฒ ๋ง๋ค์ง ์๊ธฐ → ์ธํฐํ์ด์ค ํ์ฉํด์ ์์ฑํ๋ค๋๊ฐ
- Client ํด๋์ค๋ Leaf์ Composite ํด๋์ค์ ์ง์ ์ฐธ์กฐ ํ์ง ๋ง์ธ์ฅ ๐ โ๏ธ๐ โ๏ธ
- ์ธํฐํ์ด์ค์ธ Component๋ง ์ฐธ์กฐํ๊ธฐ
- Leaf๋ Component ์ธํฐํ์ด์ค ๊ตฌํ
- Composite ๋ Component ๊ฐ์ฒด ์์๋ค์ ์ ์งํ๊ณ , operation() ๊ฐ์ ์์ฒญ์ ํตํด ์์๋ค์๊ฒ ์ ๋ฌ
์ ๋ฆฌํ์๋ฉด
- Leaf: Component ์ธํฐํ์ด์ค ๊ตฌํ, ๊ตฌ์ฒด ํด๋์ค
- Component: ๋ชจ๋ component๋ฅผ ์ํ ์ถ์ํ ๊ฐ๋ , ์ธํฐํ์ด์ค
- Composite: Component ์ธํฐํ์ด์ค ๊ตฌํ, ๊ตฌํ๋๋ leaf/composite ๋ค์ ๊ฐ์ง๊ณ ๊ด๋ฆฌํ๋ ๋ฉ์๋ ๊ตฌํ.
- ์ธํฐํ์ด์ค์ ์์ฑ๋ ๋ฉ์๋๋ ์์์๊ฒ ์์ํ๋ ์ฒ๋ฆฌ๋ฅผ ํด์ค
๊ทธ๋ผ ์ด๋ ๊ฒ ๊ตฌํ ๊ฐ๋ฅ
Client๋ → Coposite1์๋ง ์์ฒญ์ ๋ณด๋ด๋ฉด ๋ค ์์์ ์ฃผ๋ฃจ๋ฃฉ ๋๋ ํํ
Component ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๋ค์ ์์ ์ ๋ชจ๋ ์์ ์์์๊ฒ ์ ๋ฌ
๊ทธ๋ผ ์ด๊ฑธ ๋ญ์๋ค๊ฐ ์ฐ๋๋ฉด
public class ImportCommand : CompositeCommand
{
public ImportInvoicesCommand()
{
AddChild(new PlayVideoCommand());
AddChild(new InsertToDatabaseCommand());
AddChild(new RequestToCameraCommand());
}
}
์ด๋ฐ ์์ผ๋ก ํด๋ผ์ด์ธํธ์์ ์ํํ ์์ ๋ค์ ๋ฑ๋ก์ ํด ๋๊ณ
public void ImportInvoices()
{
var command = new ImportInvoicesCommand();
command.Execute();
}
Execute() ํจ์๋ง ํธ์ถํด์ฃผ๋ฉด, ์์์ AddChild๋ก ๋ฑ๋กํด์ค ์์ ๋ค์ด ์คํ๋๋๋ก ํ์ฉํ ์ ์๋ค
๋น์ทํ ์์ ์ธ๋ฐ ์ฌ๋ฌ ๊ฑด ์งํํ ๋ ์ฌ์ฉํ๋ฉด ์ข์ ๋ฏ ํ๋ค.
'๐Algorithm ------------ > ๊ฐ๋ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ฃ๊ตฌ์กฐ- ์๋ฃ๊ตฌ์กฐ ์ข ๋ฅ๋ฅผ ์์๋ณด์ (0) | 2021.07.20 |
---|