Facade

๋ณต์žก์„ฑ์„ ๊ฐ์ถ”๊ธฐ ์œ„ํ•ด ๋‹จ์ˆœํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ตฌ์กฐ์  ๋””์ž์ธ ํŒจํ„ด

์žกํ•œ ์‹œ์Šคํ…œ์— ๋‹จ์ˆœํ™”๋˜๊ณ  ๋†’์€ ์ˆ˜์ค€์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‹œ์Šคํ…œ๊ณผ ๋” ์‰ฝ๊ฒŒ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ตฌ์กฐ์  ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค.

ํผ์‚ฌ๋“œ ํŒจํ„ด์˜ ๊ตฌ์„ฑ

  • Facade: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•˜์œ„ ์‹œ์Šคํ…œ์— ์•ก์„ธ์Šคํ•˜๋Š” ์ง„์ž…์ , ๊ธฐ๋ณธ ํ•˜์œ„ ์‹œ์Šคํ…œ์˜ ๋ณต์žก์„ฑ์„ ์ถ”์ƒํ™”ํ•˜๊ณ  ์ˆจ๊ธฐ๋Š” ๋‹จ์ˆœํ™”๋œ ๊ณ ๊ธ‰ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณต

  • ํ•˜์œ„ ์‹œ์Šคํ…œ: ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐœ๋ณ„ ๊ตฌ์„ฑ ์š”์†Œ ๋˜๋Š” ํด๋ž˜์Šค

์•„๋ž˜ ์ฝ”๋“œ๋Š” ํผ์‚ฌ๋“œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ํ•˜์œ„ ์‹œ์Šคํ…œ์„ ๋‹จ์ˆœํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ž˜ํ•‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค€๋‹ค.

// ํ•˜์œ„ ์‹œ์Šคํ…œ
class SubSystem1 {
    public void doSomething() {
        System.out.println("SubSystem1");
    }
}

class SubSystem2 {
    public void doSomething() {
        System.out.println("SubSystem2");
    }
}

class SubSystem3 {
    public void doSomething() {
        System.out.println("SubSystem3");
    }
}

// ํผ์‚ฌ๋“œ
class Facade {
    private SubSystem1 subSystem1;
    private SubSystem2 subSystem2;
    private SubSystem3 subSystem3;

    public Facade() {
        this.subSystem1 = new SubSystem1();
        this.subSystem2 = new SubSystem2();
        this.subSystem3 = new SubSystem3();
    }

    public void doSomething() {
        subSystem1.doSomething();
        subSystem2.doSomething();
        subSystem3.doSomething();
    }
}

class Client {
    Facade facade = new Facade();

    // ํผ์‚ฌ๋“œ๋ฅผ ํ†ตํ•ด ํ•˜์œ„ ์‹œ์Šคํ…œ์— ์ ‘๊ทผ
    public void doSomething1() {
        facade.doSomething();
        // ...
    }

    public void doSomething2() {
        facade.doSomething();
        // ...
    }
}

ํผ์‚ฌ๋“œ ํŒจํ„ด์˜ ์ด์ 

  • ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ ๋‹จ์ˆœํ™”: ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๋‹จ์ผ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ™”(ํ•˜์œ„ ์‹œ์Šคํ…œ์˜ ๋ณต์žก์„ฑ์„ ์€๋‹‰)

  • ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ: ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด Facade ํด๋ž˜์Šค ๋‚ด์— ํฌํ•จ๋˜์–ด ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์œ ์ง€ ๋ณด์ˆ˜ ์šฉ์ด์„ฑ ํ–ฅ์ƒ

ํŒŒ์‚ฌ๋“œ ํŒจํ„ด์„ ์ด์šฉํ•œ ์ˆœํ™˜ ์ฐธ์กฐ ํ•ด๊ฒฐ

  • ์ˆœํ™˜ ์ฐธ์กฐ: ๋‘ ๊ฐœ ์ด์ƒ์˜ ํด๋ž˜์Šค๊ฐ€ ์„œ๋กœ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ์ƒํƒœ

์ˆœํ™˜ ์ฐธ์กฐ๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ํ”ํžˆ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋กœ, ์ˆœํ™˜ ์ฐธ์กฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง„๋‹ค. ์ด ๋ฌธ์ œ๋Š” ํŒŒ์‚ฌ๋“œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ˆœํ™˜ ์ฐธ์กฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ฝ”๋“œ

class ClassA {
    private ClassB classB;

    public ClassA() {
        this.classB = new ClassB();
    }

    public void doSomething() {
        // ...
    }

    public void useClassB() {
        classB.doSomething();
    }
}

class ClassB {
    private ClassA classA;

    public ClassB() {
        this.classA = new ClassA();
    }

    public void doSomething() {
        // ...
    }

    public void useClassA() {
        classA.doSomething();
        // ...
    }
}
  • ํผ์‚ฌ๋“œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆœํ™˜ ์ฐธ์กฐ ํ•ด๊ฒฐ

class ClassA {
    private ClassB classB;

    public ClassA(ClassB classB) {
        this.classB = classB;
    }

    public void doSomething() {
        // ...
    }

    public void useClassB() {
        classB.doSomething();
    }
}

class ClassB {
    // ClassA๋ฅผ ํ•„๋“œ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์Œ
//    private ClassA classA;

    public ClassB() {
    }

    public void doSomething() {
        // ...
    }

    // ClassA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ ์‚ญ์ œ
//    public void useClassA() {
//        classA.doSomething();
//        // ...
//    }
}

class Facade {
    private ClassA classA;
    private ClassB classB;

    public Facade() {
        this.classA = new ClassA(this.classB);
        this.classB = new ClassB(this.classA);
    }

    public void useClassAwithClassB() {
        classA.doSomething();
        classB.doSomething();
        // ...
    }
}

ClassB์—์„œ ClassA๋ฅผ ํ•„์š”๋กœ ํ–ˆ๋˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋ณ„๋„์˜ Facade ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ClassB๊ฐ€ ๋”์ด์ƒ ClassA๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋„๋ก ํ•˜์—ฌ ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

Last updated