Creation PatternsAdapter (aka. Wrapper)Factory MethodAbstract FactorySingletonPrototypeBuilderStructural PatternsBridgeCompositeDecoratorFacadeFlyweightProxyBehavioral PatternsTemplate MethodStrategyVisitorChain Of ResponsibilityMediatorObserverMementoStateCommandInterpreter
Creation Patterns
Adapter (aka. Wrapper)
- Client๊ฐ ํ์ํ Target์ ์ญํ ์ Adapter๋ก ๊ตฌํํ๋ค.
- Adapter๊ฐ Adaptee๋ฅผ ์ด์ฉํ๋ ๋ฐฉ์์ ์์(inherit) ์์(delegate) ๋๊ฐ์ง๊ฐ ์๋ค.
- ์์์ implementation, ์์์ aggregation ์ผ๋ก ๊ตฌํํ๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ์์์ด ๋ถ์์ฉ์ด ์ ์๋ฐ, ์์์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์์ class์ ๋ด๋ถ ๊ตฌํ์ ์์กดํ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
- ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ณ๊ฒฝ ์์ด ๊ทธ๋๋ก ์ฐ๊ณ ์ถ์ ๊ฒฝ์ฐ ํ์ํ ์ธํฐํ์ด์ค์ ๋ง์ถฐ์ Adapter๋ฅผ ๊ตฌํํ๋ค.
- ๋๋ ์๋ก์ด ๋ฒ์ ์ ์ฝ๋๋ง ์ ์ง๋ณด์ํ๊ณ ์ถ๋ค๋ฉด ์๋ก์ด ๋ฒ์ ์ ๊ตฌํ์ Adaptee๋ก, ๊ตฌ๋ฒ์ ์ ์ธํฐํ์ด์ค๋ฅผ Target๋กํ์ฌ Adapter๋ฅผ ๊ตฌํํ๋ค.
Factory Method
- Instance๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ super class์์ ๊ฒฐ์ ํ๋ ์ค์ง์ ์ธ ์์ฑ์ child class์์ ๋ด๋นํ๋ค.
- ์ฌ๊ธฐ์ ์์ฑํ๋ ๋ฐฉ์์ด๋, ์ด๋ค method๋ฅผ ์ด๋ค parameter๋ก ํธ์ถํ์ฌ instance๋ฅผ ์์ฑํ๋์ง์ ๋ํ ๋ถ๋ถ์ด๋ค.
- ์:
CardFactory
๋createCard()
method๋ฅผ ํธ์ถํ์ฌCard
instance๋ฅผ ์์ฑํ๋ค.
String.valueOf(1); List.of(โ1โ, โ2โ, โ3โ); Arrays.asList(new int[]{1, 2, 3});
Abstract Factory
- Factory pattern๊ณผ ์ฌ์ค์ ๋์ผํ์ง๋ง Factory์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ฒด(ConcreteFactory)๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์์ ์ฐจ์ด๊ฐ ์๋ค.
- Factory pattern์์๋ Client์์ ConcreteFactory๋ฅผ ์ง์ ์ ์ผ๋ก ํธ์ถํ๋ค.
- ํ์ง๋ง Abstract Factory์์๋ ConcreteFactory๋ฅผ reflection์ผ๋ก ์์ฑํ๋ฏ๋ก ์ง์ ์ ์ผ๋ก ConcreteFactory๋ฅผ ์ปดํ์ผํ์ฌ ๋งํนํ์ง ์๊ฒ ๋๋ค.
package factory; public abstract class Factory { public static Factory getFactory(String className) { Factory factory = null; try { factory = (Factory)Class.forName(className); } catch (ClassNotFoundException e) { System.out.println(className + " was not found"); } catch (Exception e) { e.printStackTrace(); } return factory; } public abstract Link createLink(String caption, String url); public abstract Card createCard(String title); public abstract Page createPage(String title, String author); };
- Factory pattern์์๋ ์ ํ, Abstract Factory pattern์์๋ ์ฌ๋ฌ๊ฐ์ง ๋ถํ์ ์์ฑํ๋ ๊ฒ์ผ๋ก ๋น์ ํ๊ธฐ๋ ํ๋๋ฐ ์ฌ์ค ์์ชฝ๋ค ์์ฑํ๋ ์ธ์คํด์ค ํ์ ์ ๊ฐ์ง์ ์ฐจ์ด๋ง ์์ ๋ฟ ๋์ผํ ์์ฑ ๋ฐฉ์์์ ๊ฐ์ ํ ์ ์๋ค.
- ๋ฌผ๋ก Factory method pattern์ ๊ฒฝ์ฐ concrete class๋ก ๋ถํฐ ์ง์ instance๋ฅผ ์์ฑํ๋ฏ๋ก Abstract Factory pattern๊ณผ๋ ํ์ฐํ ๊ตฌ๋ถ๋๋ค.
- ์๋ก์ด ๋ถํ์ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ ๋ชจ๋ ConcreteFactory์ method ์ถ๊ฐ๋ฅผ ์ํ ๋ณ๊ฒฝ์ด ํ์ํ๋ค๊ณ ํ์๋๋ฐ ์ฌ์ค ์ด ๋ถ๋ถ์ factory method์ ๊ธฐ๋ณธ ๊ตฌํ์ ํตํด์ ํํผํ ์ ์์ง ์์๊น ํ๋ค.
public class DefaultFactory extends Factory { public Link createLink(String caption, String url) { throw new UnsupportedOperationException(); } ... };
Singleton
- instance๊ฐ ํ๋๋ง ์กด์ฌํ๋ค๋ ๊ฒ์ ๋ณด์ฆํ๋ ํจํด.
- ์์ฑ์๋ private๋ก ์ ํํ๊ณ ์ ์ผํ instance๋ฅผ ๋๋ ค์ฃผ๋ static method (๋ณดํต
getInstance
)๋ฅผ ์ ์ํ๋ค. getInstance
๋ static factory method์ ์ผ์ข ์ด๋ค.- static factory method ์ฒ๋ผ parameter๋ฅผ ๋ฐ์์ ํด๋น parameter์ ๋์๋๋ ์ ์ผํ instance๋ฅผ ๋๋ ค์ฃผ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
- instance๋ฅผ method ํธ์ถ ์ ์์ฑํ๋ค๋ฉด ์ฌ๋ฌ thread์์ ์ ๊ทผํ ๋ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ก ์ ์ํ๋ค (
synchronized
keyword ์ฌ์ฉ).
- instance์ ์๋ฅผ ์ ์ผํ๊ฒ ์ ์ฝํจ์ผ๋ก์ ๊ตฌํ์ ๋ณต์ก๋๋ฅผ ์ค์ผ ์ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
- Java์์๋ enum์ ์ฌ์ฉํ์ฌ ๊ตฌํํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
enum Singleton { INSTANCE; public void hello() { System.out.println("say hello!"); } } // ์๋์ ๊ฐ์ด ์ฌ์ฉํ๋ค. Singleton.INSTANCE.hello();
Prototype
- ๊ฐ์ฒด์ ๋ณต์
clone
๋ฅผ ํตํด์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ธ๋ค. ๋ณดํต ์๋์ ๊ฐ์ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ค. - ๊ฐ์ฒด์ ์ข ๋ฅ๊ฐ ๋๋ฌด ๋ง์์ ์ด๋ฅผ ๊ฐ๊ฐ class๋ก ์์ฑํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ.
- ๋์ผํ class๋ก ์์ฑ๋ ๊ฐ์ฒด์ด์ง๋ง data์ ๋ฐ๋ผ์ ์๋ก ๋ค๋ฅธ ๋์์ ํ ์ ์๋ ๊ฒฝ์ฐ์ ์๊ฐ ๋ง์ ๋ ์ฌ์ฉํ๋ค.
- class๋ก ๋ถํฐ ์ง์ instance๋ฅผ ์์ฑํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ.
- ์ด ๋ถ๋ถ์ ๊ฐ์ฒด ์์ฑ ๊ณผ์ ๋๋ ๋ด๋ถ์ state๊ฐ ๋ณต์กํ์ฌ ์ด๋ฅผ ๋ณต์ฌํด์ ์ฌ์ฉํด์ผ ๋๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํ๋ ๊ฒ์ด๋ค.
- framework๋ฅผ ํน์ class์ ์์กดํ์ง ์๊ฒ ๋ง๋ค๊ณ ์ถ์ ๊ฒฝ์ฐ.
- ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง ์ํ ๊ฐ์ฒด๋ฅผ ๋ฐ์์ ๋ฑ๋กํ๊ณ ์ดํ์ ๋ฑ๋ก๋ ๊ฐ์ฒด๋ฅผ ๋ณต์ ํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ ๋งํ๋ค.
- ๋ณต์ฌ๋ฅผ ์ํ ๋ณ๋์ method๋ฅผ ์ ์ํ๋ ๊ฒ๋ ๊ฐ๋ฅํ์ง๋ง Java์ ๊ฒฝ์ฐ
clone
method๋ฅผ override ํ ์๋ ์๋ค.
Builder
- ์ผ๋ จ์ ์์ (method๋ก ํํ)์ ํตํด์ ๋ฐ์ดํฐ ๋๋ ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํ๋ค.
- Client - Director - Builder๋ก ์ญํ ์ด ๋๋๋ค.
- Client๋ Director์๊ฒ ๋ชฉ์ ํ๋ ๋ฐ์ดํฐ ๋๋ ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํด ๋ฌ๋ผ๊ณ ์๋ขฐ
construct(BuilderI)
ํ๋ค. - Director๋ Builder์ method ๋ง์ ํธ์ถํ์ฌ ๋ฐ์ดํฐ ๋๋ ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํ๋ค.
- Director๋ builder์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ฒด๋ฅผ ๋ชจ๋ฅด๋ฉฐ Client๊ฐ ์๋ขฐํ ๋๋ก ๊ฐ์ฒด์ ๊ตฌ์ฑ๋ง ์ ๊ฒฝ์ด๋ค.
- ์ด๋ ์์กด์ฑ ์ฃผ์ (Dependency Injection)์ ํ ํํ๋ก ๋ณผ ์ ์๋ค.
- Client๋ ๊ฒฐ๊ณผ์ ๊ตฌ์ฑ์ Director์๊ฒ ์์ํ๋ฉฐ ์์ ์ ์ ํ ๊ด์ฌํ์ง ์๋๋ค.
- ๋ค๋ง Client๋ ์ต์ข ์ ์ผ๋ก ๊ตฌ์ฑ๋ ๊ฒฐ๊ณผ๋ฅผ Builder๋ก ๋ถํฐ ์ง์ ๋ฐ๋๋ค.
- ์ด ๋ ์ฌ์ฉ๋๋ method๋ ๋ฐ๋์ interface๋ก ์ ์๋์ด ์์ด์ผ ํ ํ์๋ ์๋ค.
Structural Patterns
Bridge
- ์์์ ๊ธฐ๋ฅ, ๊ตฌํ์ ๋๊ฐ์ง ๊ณ์ธต์ผ๋ก ๋ถ๋ฆฌํ์ฌ ์ํํ๋ค. ๊ตฌํ์ด๋ API์ ๊ฐ์ด ํ๊ฒฝ์ ๋ฐ๋ผ ๊ตฌํ์ฒด๊ฐ ๋ฌ๋ผ์ง๋ ๋ถ๋ถ์ ์๋ฏธํ๊ณ ๊ธฐ๋ฅ์ API๋ฅผ ์ด์ฉํด์ ์ค์ ๋ก ์ดํ๋ฆฌ์ผ์ด์ ์ด ์ํํ ์์ ์ ๊ตฌํํ๋ ๋ถ๋ถ์ ์๋ฏธํ๋ค.
- ๊ธฐ๋ฅ ๊ณ์ธต์ ๊ฒฝ์ฐ ๊ตฌํ ๊ณ์ธต์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๋ค (์:
new Painter(new LinuxFrameBuffer())
).
- ์์์ ํตํด์ ๊ธฐ๋ฅ๊ณผ ๊ตฌํ ๊ฐ์ ๋์จํ ๊ฒฐํฉ์ ๋ง๋ ๋ค.
- ๊ตฌํ ๊ณ์ธต์ ๊ฒฝ์ฐ ์ง์ ์์ฑํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ์๋ ์์ง๋ง Abstract Factory pattern์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์์ ์ ์๋ค.
- ์ค์ง์ ์ธ ๊ตฌํ ๋ถ๋ถ์ ๊ตฌํ ๊ณ์ธต์ ์์ํ๋ค๋ ์ธก๋ฉด์์ template method pattern๊ณผ ์ ์ฌํ๋ค (template method์ ๊ฒฝ์ฐ subclass์ ์์).
- Adapter pattern๊ณผ ๋น์ทํด ๋ณด์ด์ง๋ง ๋ค๋ฅด๋ค. Adapter pattern์ ๊ฒฝ์ฐ ๋์ผํ ๊ธฐ๋ฅ์ ์ํํ์ง๋ง ์ธํฐํ์ด์ค๋ ๋ค๋ฅธ ๋ ๊ฐ์ฒด๋ฅผ ๊ฒฐํฉํ๋๋ฐ ์ฌ์ฉ๋๋ค.
- ์์ : ํ๋ฉด์ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ค
- ๊ตฌํ ๊ณ์ธต
- ๊ธฐ๋ฅ ๊ณ์ธต
Composite
- ์ฌ๊ท์ ์ธ ๊ตฌ์กฐ๋ฅผ ํํํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ทธ๋ฆ์ ์ญํ ์ธ Composite์ ๋ด์ฉ๋ฌผ์ธ Leaf๋ก ๊ตฌ์ฑ๋๋ค.
- Composite ๋ด๋ถ์๋ Leaf ๋๋ ๋ค๋ฅธ Composite๊ฐ ๋ด๊ธธ ์ ์๊ณ ๋์ Component๋ผ๋ interface๋ฅผ ํตํด์ ๋์ผ์ ๋๋ค.
- ์๋ฅผ ๋ค์ด์ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ์ ๊ฒฝ์ฐ Directory (Composite), File (Leaf), Entry (Component) ๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋ ์ ์๋ค.
- ๋๋ ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ๋ฌถ์ด์ ํ๋๋ก ์ทจ๊ธ(Grouping)ํ ์ ์๋๋ก ํด์ฃผ๋ ๋ฐฉ๋ฒ๋ ์ฌ๊ธฐ์ ํด๋น๋๋ค.
- ์๋ฅผ ๋ค์ด High Order Component๋ฅผ compose๋ก ๋ฌถ์ด์ ํ๋์ HOC๋ก ํํํ๋ ๊ฒ์ด ์๊ฒ ๋ค.
Decorator
- Decorator๋ ํต์ฌ์ด ๋๋ ๊ฐ์ฒด (Component)์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ ๋์ผํ ํํ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด๋ด๋ ํจํด์ด๋ค.
- ์ค์ํ ํฌ์ธํธ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํจ์๋ ํํ๋ ๋์ผํ๊ฒ ๋ง๋ค์ด์ง๋ค๋ ์ ์ด๋ค. ์ฆ, ๊ธฐ๋ฅ์ ์ถ๊ฐ ์ฌ๋ถ๊ฐ ์ธ๋ถ๋ก ๋ถํฐ ์จ๊ฒจ์ง๋ค.
- ์ด๋ฅผ ๋ฌ๋ฆฌ ๋งํ๋ฉด decorator๋ก ๊ฐ์ธ๋๋ผ๋ ๋ด์ฉ๋ฌผ์ ์ธํฐํ์ด์ค๊ฐ ๊ทธ๋๋ก ๋ ธ์ถ๋๋ค๊ณ ํํํ ์ ์๋ค (ํฌ๊ณผ์ ).
- ํต์ฌ ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ ๊ฐํ์ง ์๊ณ ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋๋ฐ ์ด๋ ์์ฒญ์ด ํต์ฌ ๊ฐ์ฒด๋ก ์์๋๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋ํ ๊ธฐ๋ฅ ์ถ๊ฐ๋ ์ผ๋ง๋ ์ง ์ค์ฒฉ๋ ์ ์์ผ๋ฉฐ ๋์ ์ผ๋ก ๊ตฌ์ฑ ๊ฐ๋ฅํ๋ค.
- ์์๋ decorator์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ฉด์๋ ์ธํฐํ์ด์ค๋ฅผ ๊ทธ๋๋ก ์ ์ง(ํฌ๊ณผ)ํ ์ ์๋ค. ํ์ง๋ง ์์๊ณผ ๋ฌ๋ฆฌ ์์์ ๊ฐํ ๊ฒฐํฉ์ด๋ฉฐ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
- ํต์ฌ์ด ๋๋ ๊ฐ์ฒด๋ ์ธํฐํ์ด์ค ๋๋ ์ถ์ ๊ฐ์ฒด๋ก ์ ์๋ ์ ์์ผ๋ฉฐ ํ์์ ๊ฒฝ์ฐ๋ Template Method์ ์ ์ฌํ ํํ๊ฐ ๋๋ค.
- ๋จ์ ๊ธฐ๋ฅ์ abstract method๋ก ์ ์๋ ์ ์๊ณ ํต์ฌ ๊ฐ์ฒด ๋๋ Decorator์์ ๊ตฌํ๋๋ค.
- ๋จ, Template Method์ ๋ค๋ฅธ ์ ์ Decorator๋ ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ์ธ๋ ํํ๋ก ๊ตฌํ๋๋ค๋ ์ ์ด๋ค.
- ์๋ฅผ ๋ค์ด ๋ฌธ์์ด์ ์ถ๋ ฅํ๋
StringDisplay
concrete component์ ๋ฌธ์์ด์ ๊ฐ์ธ์ ๊ฒฝ๊ณ์ ์ ์ถ๋ ฅํ๋Border
decorator๊ฐ ์กด์ฌํ ๋Border
๊ฐ์ฒด๋new Border(new StringDisplay(contents))
์ ๊ฐ์ด ์์ฑ๋ ์ ์๋ค. ์ด๋ ๊ฒ ์์ฑ๋ ๊ฐ์ฒด ๋ํ ๋์ผํ component๋ก ์ทจ๊ธ๋ ์ ์๋ค.
- Java์ Reader ๊ตฌํ์ด ์ด์ ๋ํ ๋ํ์ ์ธ ์์ ์ด๋ค.
- ์ 1:
new BufferedReader(new FileReader(filePath))
- ์ 2:
new LineNumberReader(new BufferedReader(new FileReader(filePath)))
Facade
- Facade (ํ์ฌ๋) ํจํด์ ์์คํ ์ ๊ตฌ์ฑํ๋ ๋ค์ํ ์ญํ ์ ์จ๊ธฐ๊ณ ๋จ์ํ๋ ์ฐฝ๊ตฌ๋ก ์ ๊ณตํ๋ ๋ฐฉ์์ด๋ค.
- ๋ณดํต ์์คํ ์ ๊ตฌ์ฑ์ด ๊ณ ์ ๋์ด์์ด์ ์ฌ์ฉ์๊ฐ ์์คํ ์ ๊ตฌ์ฑํ๋ ๊ฐ์ฒด๋ค์ ํน์ ํ ๋ฐฉ์์ผ๋ก๋ง ์ฌ์ฉํ๊ฒ ๋ ๋ ์ทจํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค.
- Facade ๊ฐ์ฒด์๋ ์์คํ ์ ๊ตฌ์ฑํ๊ธฐ ์ํด ํ์ํ ๋ชจ๋ ๋ก์ง์ ๋ด๊ณ ์๋ค.
- ๋ฌ๋ฆฌ ๋งํ๋ฉด ์์คํ ์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์ฝ๋๋ก ํํํ ๊ฒ์ด๋ค.
- ๋งค๋ฒ ์ฌ์ฉ์๊ฐ ์ญํ ํ๋๋ฅผ ์ํํ๊ธฐ ์ํด์ ์์คํ ๋ด๋ถ์ ๊ฐ์ฒด๋ค์ ๊ตฌ์ฑํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํด์ ์ํํ์ง ์๊ฒ ๋ง๋ค์ด ์ค๋ค.
- ๋ํ ์ฌ์ฉ์๊ฐ ์ค์๋ก ๋ด๋ถ์ ๊ฐ์ฒด๋ฅผ ์๋ชป ๊ตฌ์ฑํ๋ ๊ฒฝ์ฐ, ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ๊ธฐ ์ํด ํธ์ถํด์ผ ํ๋ ํน์ ํ ๋ฃจํด์ ๋นผ๋จน๋ ๊ฒฝ์ฐ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
- Builder๋ ๋น์ทํด ๋ณด์ผ ์๋ ์๋๋ฐ Builder๋ ๋ถํ ์์ฑ๊ณผ ์ด๋ฅผ ํตํด ์์ฑํ์ ๊ตฌ์ฑํ๋ ์ญํ ์ ์์ํ๋ ๊ฒ์ด ์ค์ ์ด๋ผ๋ฉด Facade๋ ๋ด๋ถ์ ์ด๋ค ๋ถํ์ด ์๋์ง๋ ์จ๊ธฐ๊ณ ์ฌ์ฉ์์๊ฒ๋ ๋จ์ํ ์ ํ์ ์ธํ๋ง์ ์ ์ํ๋ค๋ ์ ์์ ๋ค๋ฅด๋ค.
- Adapter์๋ ๋น์ทํด๋ณด์ผ ์ ์์ง๋ง Adapter๋ ๊ตฌํ์ฒด๋ฅผ ์์ ํ์ง ์๊ณ ๋ ์ฌ์ฉ์๊ฐ ํ์๋กํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋๊ฒ ๋ชฉ์ ์ด๋ผ๋ฉด Facade๋ ์ธํฐํ์ด์ค์ ์๋ฅผ ์ค์ด๊ณ ๋จ์ํํ๋๋ฐ์ ์ค์ ์ ๋๋ค.
Flyweight
- ๋ฉ๋ชจ๋ฆฌ ์๋น๋ฅผ ์ค์ด๊ธฐ ์ํด ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- Factory Method ํจํด์ ์ด์ฉํ์ฌ ์ธ์คํด์ค ์์ฑ์ ํต์ ํ๊ณ ๋ณํ์ง ์๋ ์ ๋ณด (intrinsic)๋ฅผ ๊ธฐ์ค์ผ๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ๊ณต์ ํ๋ค.
- ๊ณต์ ๋๋ ์ธ์คํด์ค๋ฅผ ๊ด๋ฆฌํ๊ณ ์ ์ฅํ๋๋ฐ ์ถ๊ฐ์ ์ธ ์์์ด ๋ค์ด๊ฐ๋ค.
- ์๋ฅผ ๋ค์ด์ ํน์ ์ ๋ณด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด๋ฏธ ํด๋น๋๋ ์ธ์คํด์ค๊ฐ ์์ฑ๋์๋์ง ์ฒดํฌํ๊ณ ์์ผ๋ฉด ์์ฑํ๋๋ฐ ์๊ฐ์ ์๋นํ๋ฉฐ ์์ฑ๋ ์ธ์คํด์ค๋ ๋ฉ๋ชจ๋ฆฌ ์์์ ํด์ ๋์ง ์๊ณ ์ ์ง๋์ด์ผ ํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํ๋ค.
- ๋ฌผ๋ก cache๋ weak map ๋ฑ์ ์ด์ฉํ์ฌ ์ธ์คํด์ค์ ์๋ฅผ ์ผ์ ํ๊ฒ ๊ด๋ฆฌํ ์๋ ์์ง๋ง ์ด๊ฒ์ ์ต์ ํ์ ์์ญ์ด๋ค.
- Java String์์ ์ ๊ณตํ๋
intern
method๊ฐ ๋ํ์ ์ธ ์์ด๋ค.
- ์ด๋ค ๋ฉด์์๋ Singleton๊ณผ ๋น์ทํ๋ฐ Singleton์ ์ ์ผํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ์ ํ๋ค๋ ์ ์์ Flyweight๋ ํน์ ์ ๋ณด์ ๋ํด์๋ ์ ์ผํ์ง๋ง ์ ๋ณด์ ๊ฐ์๋งํผ ์ธ์คํด์ค๋ฅผ ์ ์งํ๊ณ ๊ด๋ฆฌํ๋ค๋ ์ธก๋ฉด์์ ์ฐจ์ด๊ฐ ์๋ค.
Proxy
- ๋์ ๊ฐ์ฒด๋ฅผ ๋๋ฆฌํ์ฌ ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ๋์ ๊ฐ์ฒด์ ์์ฑ์ ์ง์ฐ์ํค๊ณ ์ผ๋ถ ์์ ์ ์์ฑ ์ ์ ์ค์ค๋ก & ๋ฏธ๋ฆฌ ๋๋ฆฌํ์ฌ ์ํํ ์ ์๋ค.
- ๋๋ฆฌ์๊ฐ ์ํํ ์ ์๋ ์์ ์ ์์ฒญํ ๊ฒฝ์ฐ ๋๋ฆฌ์๋ ์ค์ ๋์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์์ ์ ์์ํ๋ค.
- ์ค์ ๋์ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ํ ์ผ๋ถ ์์ ์ ๊ฒฝ์ฐ ๋๋ฆฌ์๊ฐ ์ํ + ๋์ ๊ฐ์ฒด์ ๋ฐ์ํ๋๋ก ์์ ์ ์์ํ๊ฒ ๋๋ค.
- ๋์ ๊ฐ์ฒด์ ์์ฑ ๋ฐ ์ด๊ธฐํ ๊ณผ์ ์์ ๋ง์ ์์ ์์์ด ์ฌ์ฉ๋ ๊ฒฝ์ฐ ์ด๋ฅผ ์ง์ฐ ์ํด์ผ๋ก์จ ์ฌ์ ์ ์ผ๋ถ ์์ ์ ๋ฏธ๋ฆฌ ์๋ฃํ๊ฑฐ๋ ํ์ํ์ง ์๋ค๋ฉด ์์ฑ์ ํ์ง ์๋ ๋ฐฉ์์ผ๋ก ์ต์ ํํ ์ ์๋ค.
- ๋์์ด ๋๋ ์ค์ ๊ฐ์ฒด (RealSubject)์ ๋๋ฆฌ์ (Proxy)๋ ๋์ผํ ์ธํฐํ์ด์ค (Subject)๋ฅผ ๊ฐ๋๋ค.
- Decorator์ ๋ง์ฐฌ๊ฐ์ง๋ก ํฌ๊ณผ์ ์ธ ํน์ฑ์ ๊ฐ์ง๋ค.
- ๋๋ฆฌ์์ ์ ํ์ ์๋์ ๊ฐ๋ค.
- Virtual Proxy (๊ฐ์ ๋๋ฆฌ์)
- ์ค์ ๋ก ์ธ์คํด์ค๊ฐ ํ์ํ ์์ ์ ์์ฑํ๋ค.
- Remote Proxy (์๊ฒฉ ๋๋ฆฌ์)
- ์๊ฒฉ์ ์กด์ฌํ๋ ๊ฐ์ฒด๋ฅผ ๋ง์น ๋ก์ปฌ์ ์๋ ๊ฒ์ฒ๋ผ ํธ์ถํ๋ค.
- Access Proxy (๋ณดํธ ๋๋ฆฌ์)
- ๋์ ๊ฐ์ฒด์ ์ ๊ทผ ๊ฐ๋ฅํ ์ฌ์ฉ์๋ง ์ ๊ทผํ ์ ์๋๋ก ์ ํํ๋ค.
Behavioral Patterns
Template Method
- super class์์ ๋ผ๋๋ฅผ ๊ฒฐ์ ํ๊ณ child class์์ ๊ตฌ์ฒด์ ์ธ ๋์์ ๊ฒฐ์ ํ๋ค.
- ์ ์ฒด ์์ ์ ๋ช๊ฐ์ ๋จ์ ์์ ์ผ๋ก ๋๋๊ณ ๊ฐ๊ฐ์ interface ํ ํ๋ค.
- ์:
display() = open() + print() + close()
- super class์๋ algorithm ๋๋ logic์ด ์กด์ฌํ๊ณ child class์๋ ๋จ์ ์์ ์ ๊ตฌ์ฒด์ ์ธ implementation์ด ์๋ค.
- Abstract class๋ฅผ ์ฌ์ฉํ๋ ๋ํ์ ์ธ ์์ด๋ค.
Strategy
- ํน์ ํ context ๋ด์์ ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ฒด๋ก ๋ถ๋ฆฌ(์์)ํ์ฌ ๊ตํ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
- ์์(์: Template Method)์ผ๋ก๋ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ง๋ง ์์์ ๊ฐํ ๊ฒฐํฉ์ด๋ฉฐ ์์์ ์ฝํ ๊ฒฐํฉ์ด๊ณ ์ฝ๊ฒ ์์ ๊ฐ๋ฅํ๋ค.
Visitor
- Visitor๋ ๊ฐ์ฒด์ ๊ตฌ์กฐ์ ์ฒ๋ฆฌ๋ฅผ ๋ถ๋ฆฌํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ๊ฐ์ฒด์ ๊ตฌ์กฐ๋ Composite ํจํด์ ๊ตฌ์กฐ์ ๋ํ ์ฒ๋ฆฌ๋ Visitor ํจํด์ ์ฌ์ฉํ์ฌ ๊ตฌํ๋๋ค.
- ๊ตฌ์กฐ๋ฅผ ๋ด๋นํ๋ ๊ฐ์ฒด๋ Element, ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๋ ๊ฐ์ฒด๋ Visitor๋ก ๋ถ๋ฆฐ๋ค.
- Element์ Visitor๋ ๊ฐ๊ฐ
accept
,visit
method๋ฅผ ํตํด์ ๊ฐํ๊ฒ ๊ฒฐํฉ๋๋ค. Element::accept
method์์๋ ํน์ ๊ฐ์ฒด์ ๋ํ ์ฒ๋ฆฌ๋ฅผ Visitor๋ก ์์ํ๋ ์์ ์ ์ํํ๋ค.- ์:
File::accept(Visitor)
์ ๊ฒฝ์ฐEntryVisitor::visit(File)
์ ํธ์ถํ๋ค. ์ด๋ ๋ช ์์ ์ผ๋กFile
์ ๋ํ ์ฒ๋ฆฌ๋ฅผEntryVisitor
์๊ฒ ์์ํ๋ ๊ฒ์ด๋ค. Visitor::visit
method์์๋ Element์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ ๊ฐ์ฒด ๋ณ๋ก ์๋ก ๋ค๋ฅธ ์ฒ๋ฆฌ๋ฅผ method overloading์ ํตํด์ ๊ตฌํํ๋ค.- ์:
EntryVisitor
๋visit(File)
,visit(Directory)
๋ฅผ ๊ฐ๊ฐ ๊ตฌํํด์ผ ํ๋ค. - ๋น์ฐํ๊ฒ ์ง๋ง Visitor๊ฐ ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ์ํด์ Element๊ฐ ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ์ ๊ณตํด์ค ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค.
- ์๋ฅผ ๋ค๋ฉด
Directory
๋ ์ฒ๋ฆฌ๋ฅผ ์ํด์ ์์ ์ด ๊ฐ์งEntry
์ ๋ชฉ๋ก์ ์ ๊ณตํด์ฃผ์ด์ผ ํ๋ค. - ์ด๋ฐ ํน์ฑ์ผ๋ก ์ธํด ๊ฐ์ฒด์ ๊ตฌ์กฐ์ ์๋ก์ด ํ์
์ด ์ถ๊ฐ๋๋ค๋ฉด ๊ฐ๊ฐ์
accept
,visit
method๋ฅผ ์ถ๊ฐํด์ฃผ์ด์ผ ํ๋ค. - ์ด๋ฐ ํ์์ผ๋ก ์ํธ๊ฐ์ ํธ์ถ์ด ๋ฐ์ํ๋ ํจํด์ double dispatch๋ผ๊ณ ํ๋ค.
- Visitor ํจํด์ OCP (Open-Closed Principle)์ ๋ํ์ ์ธ ์์ด๋ค.
- ๊ฐ์ฒด๋ ํ์ฅ์๋ ์ด๋ ค์๋ ์์ ์๋ ๋ซํ ์์ด์ผ ํ๋ค.
- ์๋ก์ด ์ฒ๋ฆฌ ๋ฐฉ์์ด ํ์ํ ๋๋ Visitor๋ฅผ ์๋ก ๊ตฌํํจ์ผ๋ก์ ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์๋ค.
- ๋ฐ๋ฉด ๊ธฐ์กด ํด๋์ค๋ ์ด์ ๋ฐ๋ฅด๋ ์์ ์ด ํ์ ์๊ฒ ๋๋ค.
- ๋ค๋ง ์ด๋ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ํ์ฅ์๋ง ํด๋น๋๋ฉฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ธ Element ๊ฐ์ฒด์ ํ์ฅ์๋ ์ ์ฉ๋์ง ์๋๋ค.
- ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๊ทธ์ ๋ฐ๋ผ ์๋ก์ด ConcreteElement๊ฐ ์ถ๊ฐ๋๋ฏ๋ก Visitor์ ์ธํฐํ์ด์ค๊ฐ ๋ณ๊ฒฝ๋๊ณ ์ฐ์์ ์ผ๋ก ConcreteVisitor์ ์์ ์ด ๋ฐ์ํ๊ฒ ๋๋ค.
- ๋ค๋ง ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ณ๊ฒฝ๋ณด๋ค๋ ๊ธฐ๋ฅ์ ์ถ๊ฐ๊ฐ ๋ ๋น๋ฒํ๊ฒ ๋ฐ์ํ๋ฏ๋ก ์ด๋ฐ ์ ๋ต์ด ์ค์ฉ์ ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
Q. accept method๋ ๊ผญ ํ์ํ๊ฐ? C++์variant
๊ตฌํ์ ๋ณด๋ฉดaccept
method๋ฅผ ํ์ฉํ์ง ์๊ณ ๋ Visitor ํจํด์ ๊ตฌํํ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด๋ C++์์ ์ ๊ณตํ๋ SFINAE (Substitution Failure Is Not An Error) ๊ธฐ๋ฒ์ ์ด์ฉํ ๊ฒ์ผ๋ก ํน์ ํ ํ์ ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ์์ํ๋ ๊ฒ์ ์ธ์ด์ ๊ธฐ๋ฅ์ผ๋ก ๊ตฌํํ ๊ฒ์ผ ๋ฟ์ด๋ค. Java์์๋ reflection API์ ์ด์ฉํ๋ฉด ์ ์ฌํ๊ฒ ๊ตฌํ ๊ฐ๋ฅํ๋ค. ์์์ ๋ฐฉ์์ด ๋จ์ํ Visitor๋ฅผ ํธ์ถํ๋ ๊ฒ ๋ฟ์ด๋ผ๋ฉด ์ด๋ ๊ฒ ํ๋๋ผ๋ ๋ฌธ์ ๋ ์์ ๊ฒ์ด๋ค (๋ฌผ๋ก reflection API๋ฅผ ์ฐ๋ฉด ์ฑ๋ฅ ๋ฌธ์ ๋ ๊ณ ๋ คํด์ผ ๊ฒ ์ง๋ง). ํ์ง๋ง ์ด์ ๊ฐ์ ๋ฐฉ์์ ์ฒ๋ฆฌ๋ฅผ ์์ํ๋ค๋ ์ฌ์ค์ ๋ฌต์์ (implicit)์ผ๋ก ๋ณ๊ฒฝํด๋ฒ๋ฆฐ๋ค. ๋ํ ์ผ๋ฐ์ ์ด์ง๋ ์์ง๋ง ๊ฐ์ฒด๊ฐ ์์ํ๋ ๋ฐฉ์์ ๋ค๋ฅด๊ฒ ๊ฒฐ์ ํ ์ ์๋ ๊ฐ๋ฅ์ฑ๋ ์ ๊ฑฐํด๋ฒ๋ฆฐ๋ค. ์๋ฅผ๋ค๋ฉด ์ด๋ค ๊ฐ์ฒด๋ Visitor์๊ฒ ์ฒ๋ฆฌ๋ฅผ ์ฌ๋ฌ๋ฒ ํ๋๋ก ์์ฒญํ ์๋ ์๋ค. ๊ฒฐ๋ก ์ ์ผ๋กaccept
method๋ Element ๊ฐ์ฒด๊ฐ ์ด๋ป๊ฒ Visitor์๊ฒ ์ฒ๋ฆฌ๋ฅผ ์์ํ ๊ฒ์ธ๊ฐ๋ฅผ ๊ฒฐ์ ํ๋ ํต๋ก์ด๋ฏ๋ก ํ์ํ๋ค.
Chain Of Responsibility
- ํน์ ํ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๊ฐ ๊ณ ์ ๋์ด์์ง ์์ ๊ฒฝ์ฐ ์ฌ๋ฌ ๊ฐ์ ์ฒ๋ฆฌ์ (Handler)๋ฅผ ์ฎ์ด์ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ์์ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ์ด ํจํด์ ๋ง์น LinkedList ์ฒ๋ผ ์ฌ๋ฌ ๊ฐ์ Handler ์์ฐจ์ ์ผ๋ก ์ฐ๊ฒฐํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ ์ด ์ค ํ๋์ Handler๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๊ฒ ๋๋ค.
- ํน์ ํ Handler๋ ์์ฒญ ์ฒ๋ฆฌ ์ฌ๋ถ๋ฅผ ํ๋จํ์ฌ (1) ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋๋ ค์ฃผ๊ฑฐ๋ (2) ๋ค์ Handler๋ก ์์ฒญ์ ์ฒ๋ฆฌ๋ฅผ ์์ํ๋ค.
- ์์ฒญ์ ์ด๋ค ์ฒ๋ฆฌ์๊ฐ ์ฒ๋ฆฌํด์ผ ํ ์ง ์จ๊ธฐ๊ฒ ๋๋ฏ๋ก ์์ฒญ์์ ์ฒ๋ฆฌ์ ๊ฐ์ ๊ด๊ณ๋ฅผ ๋์จํ๊ฒ ๋ง๋ ๋ค.
- ์ด ํจํด์ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ์ค์์์ ์์ฒญ์ ํํ์ ๋ฐ๋ผ ์ฒ๋ฆฌ์๋ฅผ ๋งค์นญํ๋ ๋ฐฉ์์ ์ฌ์ฉํด์ผ ํ๋ฉฐ ์ด๋ฐ ๋ฐฉ์์ ์์ฒญ์์ ์ฒ๋ฆฌ์์ ๊ฒฐํฉ์ ๋ ๊ฐํ๊ฒ ๋ง๋ ๋ค.
- Decorator ํจํด๊ณผ ๊ฐ์ด ์ฌ์ฉ๋ ์ ์๋ค.
- ์๋ฅผ ๋ค์ด ํน์ Handler๋ ์์ฒญ์ ๋ํ ์ผ๋ถ ํญ๋ชฉ์ ์ฒ๋ฆฌํ ๋ค ๋ค์ Handler์๊ฒ ๋๋จธ์ง ์ฒ๋ฆฌ๋ฅผ ์์ํ ์ ์๋ค.
- ๋ํ์ ์ธ ๊ตฌํ์ ์๋ก middleware๊ฐ ์๋ค.
- Middleware๋ ํน์ ํ ์์ฒญ์ ๋ํ ๋ ๋ฆฝ์ ์ธ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ฒ๋ฆฌ์๋ก ํน์ ํ ์์์ ๋ฐ๋ผ ๊ฒฐํฉ๋ ์ ์๋ค.
Mediator
- ๋ค์์ ๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋ ์์คํ ์์ ์ฌ๋ฌ ๊ฐ์ฒด ๊ฐ์ ๋ฉ์์ง ์ ์ก์ ๋จ์ํํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ๊ฐ์ฒด์ ์๊ฐ ๋ง์์ง ์๋ก ์ํธ๊ฐ์ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ด๊ณ์ ์๋ ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐํ ์ ์๋ค.
- ์ฌ๋ฌ ๊ฐ์ฒด์ ๊ฑธ์ณ์๋ ์ํ๋ฅผ ๊ธฐ์ค์ผ๋ก ํน์ ๊ฐ์ฒด์๊ฒ ์ง์๋ฅผ ๋ด๋ ค์ผ ํ๋ค๋ฉด ์ด๋ฅผ ์ค์์์ ์ ์ดํ ์ ์๋ ์ค์ฌ์๊ฐ ํ์ํ๋ค.
- ๋ง์ผ ์ค์ฌ์๊ฐ ์๋ค๋ฉด ์ง์์ ๊ด๋ จ๋ ๊ฐ๋ณ ๊ฐ์ฒด ๋ง๋ค ๋ณ๊ฒฝ ์ฌํญ์ ์ถ์ ํ๋ ๋์ผํ ์ํ์ ๊ตฌํ์ ์์ฑํด์ผ ํ๋ค.
- ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ์ง์ (๋ฉ์์ง ์ ์ก)ํ๋ ์์ ์ ์ค์ฌ์์๊ฒ ์์ํ๊ณ ๊ฐ๋ณ ๊ฐ์ฒด๋ ์์ ์ ์ญํ ์๋ง ์ถฉ์คํ๊ฒ ๋ง๋ค ์ ์๋ค.
- ์ดํ๋ฆฌ์ผ์ด์ ์ ์์กด์ฑ์ด ๋์ ๋น์ฆ๋์ค ๋ก์ง์ ์ค์ฌ์๋ผ๋ ํํ๋ก ๋ถ๋ฆฌํด๋ด๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋ ์ ์๋ค.
- ๊ฐ๋ณ ๊ฐ์ฒด๋ ์ค์ฌ์์๊ฒ ๋ฉ์์ง๋ฅผ ๋ณด๊ณ ํ๋ฉฐ ์ค์ฌ์๋ ์ด๋ฅผ ๋ฐํ์ผ๋ก ํน์ ๊ฐ์ฒด์๊ฒ ์ง์๋ฅผ ๋ด๋ฆฐ๋ค.
- ๊ฐ๋ณ ๊ฐ์ฒด๊ฐ ์ค์ฌ์์๊ฒ ๋ณด๊ณ ํ๋ ๋ฐฉ์์ Observer ํจํด์ ์ด์ฉํ ์ ์๋ค.
- ์ค์ฌ์๋ ์ด๋ฅผ ๋ฐํ์ผ๋ก ํน์ ๊ฐ์ฒด์ ์ง์๋ฅผ ๋ด๋ฆด ์ ์๋ค. ์ง์ ๋์์ด ๋๋ ๊ฐ์ฒด์์ ๊ฒฐํฉ์๋ ๋ค๋ฅธ ํจํด์ ํ์ฉํ ์๋ ์๊ฒ ๋ค.
- ์๋ฅผ ๋ค์ด ์ค์ฌ์๊ฐ ํน์ ๊ฐ์ฒด์ ์ง์๋ฅผ ๋ด๋ฆฌ๋ ๊ฒ ์กฐ์ฐจ๋ Observer ํจํด์ ์ ์ฉํ ์ ์๋ค.
Observer
- ๊ด์ฐฐ ๋์ ๊ฐ์ฒด (Subject)์ ๊ด์ฐฐ์ (Observer)๋ฅผ ๋ฑ๋กํจ์ผ๋ก์ ์ํ ๋ณํ๋ฅผ ๊ฐ์งํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- Observer๋ผ๋ ์ด๋ฆ๊ณผ ๋ฌ๋ฆฌ ๊ด์ฐฐ์๋ ๊ด์ฐฐ ๋์ ๊ฐ์ฒด๊ฐ ์ฃผ๋ ์ ๋ณด๋ฅผ ์๋์ ์ผ๋ก ๋ฐ์๋ค์ด๊ธฐ๋ง ํ๋ค.
- ๊ด์ฐฐ ๋์ ๊ฐ์ฒด๋ ๊ด์ฐฐ์์ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ํตํด์ ์ํ๊ฐ ๋ณ๊ฒฝ๋์์ ๋ ์๊ธฐ ์์ ๋๋ ๊ฐ์ฒด์ ์ ๋ณด๋ฅผ ํต์งํ๋ค.
- ํ๋์ ๊ด์ฐฐ ๋์ ๊ฐ์ฒด์ ๋ํด์ ๊ด์ฐฐ์๋ ํ๋ ์ด์์ผ ์ ์๋ค.
Memento
- ํน์ ํ ๊ฐ์ฒด์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ํ์์ ๋ฐ๋ผ ๋ณต์ํ ํ์๊ฐ ์์ ๋ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ์ญํ ์ธ ๊ด๋ฆฌ์ธ Caretaker, ์ํ์ ๋ํ snapshot์ ์์ฑํ๋ ์ญํ ์ธ ์์ฑ์ Originator๊ฐ ์กด์ฌํ๋ค.
- Memento ํจํด์ ๊ด๋ฆฌ์ธ์ด๋ผ๋ ์ญํ ์ ํตํด ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ ๋์ ๊ฐ์ฒด๋ก ๋ถํฐ ๋ถ๋ฆฌํด๋ด๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
- ์์ฑ์๋ ๊ด๋ฆฌ์ธ์ ์์ฒญ์ ๋ฐ๋ผ (1) ํน์ ํ ๊ฐ์ฒด์ ์ํ Memento๋ฅผ ์์ฑํ๊ฑฐ๋ (2) Memento๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ๋ณต์ํ ์ ์๋ค.
- ๊ฐ์ฒด์ ์ํ Memento๋ ๊ด๋ฆฌ์ธ, ์์ฑ์ ๊ฐ๊ฐ์ ๋ํด์ ์๋ก ๋ค๋ฅธ ๋๊ฐ์ง ์ธํฐํ์ด์ค๋ฅผ ๋ ธ์ถํ๋ค.
- ๊ด๋ฆฌ์ธ์๊ฒ๋ ์ข์ narrow ์ธํฐํ์ด์ค๋ฅผ ๋ ธ์ถํ๋ค. ๊ด๋ฆฌ์ธ์๊ฒ Memento๋ ๋ธ๋ ๋ฐ์ค์ด๋ฉฐ ๋ด๋ถ๋ฅผ ์์ ํ ์ ์๊ณ ์ง์ ๋ ์ํ ๊ฐ๋ง ์ ๊ณต๋ฐ์ ์ ์๋ค.
- ์์ฑ์์๊ฒ๋ ๋์ wide ์ธํฐํ์ด์ค๋ฅผ ๋ ธ์ถํ๋ค. ์์ฑ์๋ Memento๋ฅผ ์์ฑํ๊ฑฐ๋ ๋ด๋ถ ์ํ๋ฅผ ์์ ํ ์ ์๋ค.
State
- ๊ฐ๋ณ ์ํ์ ๋ํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ๊ฐ ์ํ ๊ฐ์ฒด์ ํน์ ์ํ์์์ ์ฒ๋ฆฌ ์ญํ ์ ๋งก๊ธฐ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ๋ฌธ์ ๋ฅผ ๋ถํ (divide and conquer) ํ๋ ๋ฐฉ์ ์ค ํ๋๋ก ์์คํ ์ ์ํ์ ๋ฐ๋ผ ๋ฌธ์ ๋ฅผ ๋ถํ ํ์ฌ ๋ ์์ ๊ท๋ชจ๋ก ๋ง๋ ๋ค.
- ๋ง์ผ ์ํ ๋ณ๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๋๋ค๋ฉด ํ๋์ ๊ฐ์ฒด ๋ด๋ถ์์ ์ํ ๊ฐ์ ๋ฐ๋ผ์ ๋ถ๊ธฐ๋ฌธ์ ์์ฑํด์ผ ํ๋ค.
- ์ด๋ฐ ๋ฐฉ์์ ์ค์๋ฅผ ํ ๊ฐ๋ฅ์ฑ์ด ๋๊ณ ์๋ชป์ด ๋ฐ์ํ์ ๋ ์ธ์งํ๊ธฐ ์ด๋ ต๊ฒ ๋๋ค.
- ์ํ ๋ณ๋ก ๊ฐ์ฒด๋ฅผ ๋ถ๋ฆฌํ๊ฒ ๋๋ฉด ํน์ ์ํ์ ๋ํด ์ฒ๋ฆฌํด์ผ ๋ ํญ๋ชฉ์ด ๋ถ๋ช ํ๊ฒ ์ธํฐํ์ด์ค๋ก ์กด์ฌํ๋ฏ๋ก ๋นผ๋จน๊ณ ๊ตฌํํ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํด์ ์ธ์งํ๊ธฐ ์ฝ๋ค.
- ์ํ๋ฅผ ์ ํํ๋ ์ญํ ์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด์ธ Context๊ฐ ํ ์๋ ์๊ณ ๊ฐ๋ณ ์ํ ๊ฐ์ฒด State์ ์์ํ ์๋ ์๋ค.
- Context๊ฐ ํ ๊ฒฝ์ฐ
- Mediator ํจํด์ ์ฌ์ฉํ์ฌ ๊ฐ ์ํ ๊ฐ์ฒด๋ Context์ ๋ณ๊ฒฝ์ ๋ณด๊ณ ํ๊ณ Context๋ ์ด์ ๋ฐ๋ผ์ ์ํ๋ฅผ ๋ณํํ๊ณ ์ง์๋ฅผ ๋ด๋ฆด ์ ์๋ค.
- ์ด๋ฅผ ์ํด์ Context๋ ๋ชจ๋ State ๊ฐ์ฒด๋ฅผ ์์์ผ ํ๋ค.
- State๊ฐ ํ ๊ฒฝ์ฐ
- State๊ฐ ์ง์ ์ํ๋ฅผ ํ์ธํ์ฌ Context์๊ฒ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ผ๊ณ ๋ฉ์์ง๋ฅผ ๋ณด๋ด์ผ ํ๋ค.
- Context๋ ์ด๊ธฐ ์ํ์ ํด๋น๋๋ State๋ง ์๋ฉด ๋์ง๋ง ๊ฐ State ๊ฐ์ฒด๋ ์๋ก๊ฐ ์๋ก๋ฅผ ์์์ผ ํ๋ค.
Q. ์ํ ๋ณ๊ฒฝ ๊ด๋ฆฌ๋ ๋๊ฐ ํ๋๊ฒ ์ข์๊น? ๊ฒฐ๋ก ๋ง ๋งํ์๋ฉด Context๊ฐ ํ๋๊ฒ ๋ ์ ๋ฆฌํด ๋ณด์ธ๋ค. State๊ฐ ์ํ ๋ณ๊ฒฝ์ ๊ด๋ฆฌํ๋ค๋ฉด ๊ฐ๋ณ State์ ์ญํ ์ ์ถฉ์คํ ์ ์๊ณ ์๋ก ๋ค๋ฅธ State์ ๋ํด์ ์์์ผ๋ ํ์๊ฐ ์๋ค. ๋ํ ์ํ ๋ณ๊ฒฝ์ ์ผ๋ฐ์ ์ผ๋ก ๋จ์ผํ ์ํ๊ฐ ๋ณด๋ค๋ ๋ค์ํ ์ํ๊ฐ๋ค์ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฃจ์ด์ง๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ์ด๋ฐ ์ํฉ์์ ๊ฐ๋ณ State ๊ฐ์ฒด์์ ์ฌ๋ฌ๊ฐ์ง ์ ๋ณด๋ฅผ ๋ค๋ฃจ๋ ๊ฒ์ ๋นํจ์จ์ ์ด๋ฉฐ ์ค๋ณต๋ ์ฝ๋๋ฅผ ๋ง๋ค ๊ฐ๋ฅ์ฑ์ด ๋๋ค. ์ฐจ๋ผ๋ฆฌ Mediator ํจํด์ ์ฌ์ฉํ์ฌ Context์์ ๊ทธ๋ฐ ๋น์ฆ๋์ค ๋ก์ง์ ๋ชจ์๋๋ ๊ฒ์ด ๋ฐ๋์งํ ๊ฒ์ผ๋ก ์๊ฐ๋๋ค.
Command
- โ์์ โ์ ๊ฐ์ฒดํํ์ฌ ๊ด๋ฆฌํ๊ณ ํ์ ์ ์ง์ ๋ ์์์ ๋ฐ๋ผ ์คํํ ์ ์๋๋ก ํ๋ ๋ฐฉ๋ฒ.
- ๊ฐ์ฒดํ๋ ์์ ์ ๋ช ๋ น (Command) ๋๋ ์ฌ๊ฑด (Event)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ๊ฐ์ฒด์๊ฒ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ ๋ฉ์๋ ํธ์ถ์ ๊ฐ์ฒด๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๊ธฐ๋กํ๊ฑฐ๋ ๊ด๋ฆฌ๋ ์ ์๋ค.
- ๋ฐ๋ฉด ๋ช ๋ น ๋๋ ์ฌ๊ฑด์ ๊ฒฝ์ฐ ๊ฐ์ฒด์ ํํ๋ฅผ ๊ฐ์ง๋ฏ๋ก ์๊ฐ๊ณผ ๋ฌถ์ด์ ์ ์ฅํ๋ ๋ฑ์ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
- ๋ช ๋ น์ ์ธํฐํ์ด์ค (API), ๋ณด์ ํ๋ ์ ๋ณด๋ ์ ํด์ ธ์์ง ์์ผ๋ฉฐ ๊ตฌํํ๋ ํด๋์ค์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ค.
- ๋ช ๋ น์ด ์ํํ๋ ์ค์ ์์ ์ ์์ ์ (Recever)์ ์์๋๋ค.
Interpreter
- ํด๊ฒฐํด์ผ๋ ๋ฌธ์ ๋ฅผ ๋ฏธ๋ ์ธ์ด๋ก ํํํ๊ณ ๊ทธ ํํ์ ํด์ํ์ฌ ์คํํจ์ผ๋ก์ ํ๋ก๊ทธ๋จ์ ์์ ์์ด ๋ค์ํ ์ํฉ์ ๋์ํ ์ ์๋๋ก ํ๋ ๋ฐฉ๋ฒ.
- ์ผ๋ฐ์ ์ผ๋ก๋ ๋ฌธ์ ๊ฐ ๋ณ๊ฒฝ๋๊ฑฐ๋ ์๋ก์ด ์๊ตฌ์ฌํญ์ด ์ถ๊ฐ๋ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋จ์ ์์ ํ๋ค.
- ํด๊ฒฐํด์ผ๋ ๋ฌธ์ ๋ฅผ ๋ฏธ๋ ์ธ์ด๋ก ํํํ๊ณ ๊ทธ๊ฒ์ ํด์ํ์ฌ ์คํํ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค๋ฉด ๋ฏธ๋ ์ธ์ด๋ก ์์ฑ๋ ๋ฏธ๋ ํ๋ก๊ทธ๋จ์ ์์ ํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ๋์ํ ์ ์๋ค.
- ๋ฏธ๋ ํ๋ก๊ทธ๋จ (๋ฏธ๋ ์ธ์ด๋ก ์์ฑ) โ ๋ฏธ๋ ์ธ์ด ์ธํฐํ๋ฆฌํฐ โ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ์คํ ํ๊ฒฝ ์ 3๊ณ์ธต์ผ๋ก ๊ตฌ์ฑ๋๋ค.
- ๋ฏธ๋ ์ธ์ด๋ Backus-Naur Form (BNF)์ ๊ฐ์ ํ์์ผ๋ก ์ ์๋ ์ ์๋ค.
- BNF๋ก ์ ์๋ ํํ ์ค ํํ์ ์ ์๊ฐ ๋ค๋ฅธ ํํ์ผ๋ก ์ ๊ฐ (ํ์ฅ)๋๋ ํํ์ non-terminal, ์ ๊ฐ๋์ง ์๋ ํํ์ terminal expression ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ์ ์๋ ๋ฏธ๋์ธ์ด๋ฅผ ๊ฐ์ฒด๋ก ๊ตฌ์กฐํํ ์ ์์ผ๋ฉฐ ์ด ๋ BNF์ ์ ์๋ ํญ๋ชฉ๊ณผ ๋์๋๋ ๊ฐ์ฒด๋ฅผ ๋ ธ๋ (Node)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ์ด๋ ๊ฒ ์์ฑ๋ ๋ ธ๋๋ฅผ ํ์ํ์ฌ ์คํํจ์ผ๋ก์ ๋ชฉ์ ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
- Command ํจํด๊ณผ ๊ฒฐํฉํ์ฌ ๋ค์ํ ์์๋ก ์กฐํฉ๋ ์์ ์ ์คํํ๋ ํด์๊ธฐ๋ฅผ ๋ง๋ค ์ ์๋ค.
- ๋๋ dependency injection๊ณผ ๊ฐ์ด ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑํ๋ ๊ฐ์ฒด๊ฐ์ ๊ด๊ณ๋ฅผ ๋งบ๋ ๋ฐฉ์์ ๋ฏธ๋ ์ธ์ด๋ก ๊ธฐ์ ํ์ฌ ๊ตฌ์ฑํ ์ ์๋ค.