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
Was this helpful?