ํ๋ก์ ํจํด (Proxy Pattern)
ํ๋ก์ ํจํด์ ๋๋ฆฌ ๊ฐ์ฒด๋ฅผ ํตํด ์ค์ ๊ฐ์ฒด์ ๋ํ ์ ๊ทผ์ ์ ์ดํ๋ ๊ตฌ์กฐ์ ๋์์ธ ํจํด์
๋๋ค. ์ค์ ๊ฐ์ฒด์ ์์ฑ์ด๋ ์ด๊ธฐํ๋ฅผ ์ง์ฐ์ํค๊ณ , ์ ๊ทผ ๊ถํ์ ์ ์ดํ๋ฉฐ, ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ์ฒด์ ์ฌ์ฉ์ ์ต์ ํํ๊ณ ๋ณด์์ ๊ฐํํ ์ ์์ต๋๋ค.
์ฃผ์ ๋ชฉ์
โข
์ค์ ๊ฐ์ฒด์ ๋ํ ์ ๊ทผ ์ ์ด ๋ฐ ๋ณด์ ๊ฐํ
โข
๊ฐ์ฒด ์์ฑ์ ์ง์ฐ(lazy initialization)
โข
์๊ฒฉ ๊ฐ์ฒด์ ๋ํ ๋ก์ปฌ ์ธํฐํ์ด์ค ์ ๊ณต
โข
๊ฐ์ฒด ์ฌ์ฉ์ ๋ํ ๋ก๊น
์ด๋ ์บ์ฑ ๊ธฐ๋ฅ ์ถ๊ฐ
ํน์ง
โข
ํ๋ก์์ ์ค์ ๊ฐ์ฒด๋ ๋์ผํ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํ
โข
ํด๋ผ์ด์ธํธ๋ ํ๋ก์๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ์ค์ ๊ฐ์ฒด์ ์ ๊ทผ
โข
์ค์ ๊ฐ์ฒด์ ์์ฑ ๋น์ฉ์ด ํฐ ๊ฒฝ์ฐ ํจ๊ณผ์
โข
๋ณด์, ์บ์ฑ, ๋ก๊น
๋ฑ ๋ถ๊ฐ ๊ธฐ๋ฅ ๊ตฌํ์ด ์ฉ์ด
์์ ์ฝ๋
// Subject ์ธํฐํ์ด์ค
interface Image {
void display();
}
// RealSubject ํด๋์ค
class RealImage implements Image {
private String filename;
public RealImage(String filename) {
this.filename = filename;
loadFromDisk();
}
private void loadFromDisk() {
System.out.println("Loading " + filename);
}
public void display() {
System.out.println("Displaying " + filename);
}
}
// Proxy ํด๋์ค
class ProxyImage implements Image {
private RealImage realImage;
private String filename;
public ProxyImage(String filename) {
this.filename = filename;
}
public void display() {
if (realImage == null) {
realImage = new RealImage(filename);
}
realImage.display();
}
}
Java
๋ณต์ฌ
์ฝ๋ ์ค๋ช
์ ์์ ์ฝ๋๋ ์ด๋ฏธ์ง ๋ก๋ฉ์ ์ง์ฐ์ํค๋ ํ๋ก์ ํจํด์ ๊ตฌํ์ ๋ณด์ฌ์ค๋๋ค:
โข
Image ์ธํฐํ์ด์ค: ์ค์ ์ด๋ฏธ์ง์ ํ๋ก์๊ฐ ๊ตฌํํด์ผ ํ ๊ณตํต ์ธํฐํ์ด์ค๋ฅผ ์ ์ํฉ๋๋ค.
โข
RealImage ํด๋์ค: ์ค์ ์ด๋ฏธ์ง๋ฅผ ๋ํ๋ด๋ ํด๋์ค๋ก, ์์ฑ ์ ๋์คํฌ์์ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๋ ๋ฌด๊ฑฐ์ด ์์
์ ์ํํฉ๋๋ค.
โข
ProxyImage ํด๋์ค: ํ๋ก์ ์ญํ ์ ํ๋ ํด๋์ค๋ก, ์ค์ ์ด๋ฏธ์ง ๊ฐ์ฒด์ ์์ฑ์ ํ์ํ ์์ ๊น์ง ์ง์ฐ์ํต๋๋ค.
์ด ๊ตฌํ์ ์ฅ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
โข
์ค์ ๋ก display() ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋๊น์ง ๋ฌด๊ฑฐ์ด ์ด๋ฏธ์ง ๋ก๋ฉ์ ๋ฏธ๋ฃฐ ์ ์์ต๋๋ค.
โข
ํด๋ผ์ด์ธํธ ์ฝ๋๋ ์ค์ ์ด๋ฏธ์ง์ ํ๋ก์๋ฅผ ๋์ผํ๊ฒ ๋ค๋ฃฐ ์ ์์ต๋๋ค.
โข
์ด๋ฏธ์ง ๋ก๋ฉ ์ ํ์ ์ถ๊ฐ์ ์ธ ์ฒ๋ฆฌ(๋ก๊น
, ์ ๊ทผ ์ ์ด ๋ฑ)๋ฅผ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์์ต๋๋ค.