디자인 패턴 ~Proxy~
13237 단어 객체 지향디자인 패턴신인 프로그래머 응원uml자바
1. 소개
GoF의 디자인 패턴에서 프록시 패턴을 요약합니다.
2. Proxy 패턴이란?
3. 샘플 클래스 다이어그램
4. 샘플 프로그램
화면에 문자를 표시하는 「명명된 프린터」의 프로그램입니다.
4-1. Printable 인터페이스
Printer와 PrinterProxy 공통 인터페이스입니다.
Printable.java
public interface Printable {
// 名前の設定
public abstract void setPrinterName(String name);
// 名前の取得
public abstract String getPrinterName();
// 文字列表示(プリントアウト)
public abstract void print(String string);
}
4-2. PrinterProxy 클래스
이름 첨부의 프린터를 나타내는 클래스입니다. (대리인)
PrinterProxy.java
public class PrinterProxy implements Printable {
private String name;
private Printer real;
public PrinterProxy() {
}
public PrinterProxy(String name) {
this.name = name;
}
public synchronized void setPrinterName(String name) {
if (real != null) {
real.setPrinterName(name);
}
this.name = name;
}
public String getPrinterName() {
return name;
}
public void print(String string) {
realize();
real.print(string);
}
private synchronized void realize() {
if (real == null) {
real = new Printer(name);
}
}
}
4-3. Printer 클래스
이름 첨부의 프린터를 나타내는 클래스입니다. (본인)
Printer.java
public class Printer implements Printable {
private String name;
public Printer() {
heavyJob("Printerのインスタンスを生成中");
}
public Printer(String name) {
this.name = name;
heavyJob("Printerのインスタンス(" + name + ")を生成中");
}
public void setPrinterName(String name) {
this.name = name;
}
public String getPrinterName() {
return name;
}
public void print(String string) {
System.out.println("=== " + name + " ===");
System.out.println(string);
}
private void heavyJob(String msg) {
System.out.print(msg);
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
System.out.print(".");
}
System.out.println("完了。");
}
}
4-4. Main 클래스
메인 처리를 실시하는 클래스입니다.
Main.java
public class Main {
public static void main(String[] args) {
Printable p = new PrinterProxy("Alice");
System.out.println("名前は現在" + p.getPrinterName() + "です。");
p.setPrinterName("Bob");
System.out.println("名前は現在" + p.getPrinterName() + "です。");
p.print("Hello, world.");
}
}
4-5. 실행 결과
名前は現在Aliceです。
名前は現在Bobです。
Printerのインスタンス(Bob)を生成中.....完了。
=== Bob ===
Hello, world.
5. 장점
프록시 패턴에서는 프록시가 대리인이 되어 가능한 한 처리를 어깨 대체합니다.
샘플 프로그램에서는, Proxy역을 사용하는 것으로, 실제로 print 할 때까지, 무거운 처리(인스턴스 생성)를 지연시킬 수 있었습니다.
예를 들어, 초기화에 시간이 걸리는 기능이 많이 존재하는 시스템의 경우, 기동 시점에서는 이용하지 않는 기능까지 전부 초기화해 버리면, 어플리케이션의 기동에 시간이 걸려 버리게 됩니다.
PrinterProxy 클래스와 Printer 클래스의 2개로 나누지 않고, Printer 클래스 안에 처음부터 지연 기능을 넣어 둘 수도 있습니다만, 클래스를 나누는 것으로, 프로그램의 부품화가 진행되어 개별적으로 기능을 더하는 것 수 있습니다.
6. GitHub
7. 디자인 패턴 목록
8. 참고
이번 기사 및 샘플 프로그램은 이하의 서적을 바탕으로 작성하였습니다.
매우 이해하기 쉽고 공부가되었습니다. 감사합니다.
디자인 패턴이나 샘플 프로그램에 대한 설명이 상세하게 쓰여져 있으므로, 꼭 서적의 분도 봐 주세요.
Reference
이 문제에 관하여(디자인 패턴 ~Proxy~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/i-tanaka730/items/47efbab5eccc2d36759f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)