เอาในขณะที่จะคิดออกนี้คำตอบและสิ่งที่มันจริงๆหมายถึง ตัวอย่างบางส่วนควรทำให้ชัดเจนยิ่งขึ้น
Proxy
ครั้งแรก:
public interface Authorization {
String getToken();
}
และ:
// goes to the DB and gets a token for example
public class DBAuthorization implements Authorization {
@Override
public String getToken() {
return "DB-Token";
}
}
และมีผู้โทรมาคนนี้Authorization
เป็นคนที่น่ารัก
class Caller {
void authenticatedUserAction(Authorization authorization) {
System.out.println("doing some action with : " + authorization.getToken());
}
}
ไม่มีอะไรผิดปกติจนถึงตอนนี้ใช่ไหม? รับโทเค็นจากบริการบางอย่างใช้โทเค็นนั้น ตอนนี้มีความต้องการเพิ่มเติมในรูปภาพเพิ่มการบันทึก: หมายถึงบันทึกโทเค็นทุกครั้ง มันง่ายสำหรับกรณีนี้เพียงแค่สร้างProxy
:
public class LoggingDBAuthorization implements Authorization {
private final DBAuthorization dbAuthorization = new DBAuthorization();
@Override
public String getToken() {
String token = dbAuthorization.getToken();
System.out.println("Got token : " + token);
return token;
}
}
เราจะใช้มันอย่างไร
public static void main(String[] args) {
LoggingDBAuthorization loggingDBAuthorization = new LoggingDBAuthorization();
Caller caller = new Caller();
caller.authenticatedUserAction(loggingDBAuthorization);
}
ขอให้สังเกตว่าLoggingDBAuthorization
ถือDBAuthorization
ตัวอย่างของ ทั้งสองLoggingDBAuthorization
และการดำเนินการDBAuthorization
Authorization
- พร็อกซีจะระงับการนำไปปฏิบัติบางส่วน (
DBAuthorization
) ของอินเตอร์เฟสพื้นฐาน ( Authorization
) กล่าวอีกนัยหนึ่งพร็อกซีรู้ว่าสิ่งใดที่ถูกพร็อกซี
Decorator
:
มันเริ่มต้นสวยมากเหมือนกับProxy
อินเทอร์เฟซ:
public interface JobSeeker {
int interviewScore();
}
และการดำเนินการของมัน:
class Newbie implements JobSeeker {
@Override
public int interviewScore() {
return 10;
}
}
และตอนนี้เราต้องการเพิ่มผู้สมัครที่มีประสบการณ์มากขึ้นนั่นคือคะแนนการสัมภาษณ์บวกกับคะแนนจากคนอื่นJobSeeker
:
@RequiredArgsConstructor
public class TwoYearsInTheIndustry implements JobSeeker {
private final JobSeeker jobSeeker;
@Override
public int interviewScore() {
return jobSeeker.interviewScore() + 20;
}
}
แจ้งให้ทราบว่าผมบอกว่าบวกหนึ่งจากผู้หางานอื่น , ไม่ Newbie
A Decorator
ไม่ทราบว่ามันคืออะไรตกแต่งมันรู้เพียงสัญญาของอินสแตนซ์ที่ตกแต่ง (มันรู้JobSeeker
) สังเกตที่นี่ว่าไม่เหมือนProxy
; ในทางตรงกันข้ามรู้ว่ามันคืออะไรตกแต่ง
คุณอาจถามว่าจริง ๆ แล้วมีความแตกต่างระหว่างสองรูปแบบการออกแบบในกรณีนี้หรือไม่? เกิดอะไรขึ้นถ้าเราพยายามที่จะเขียนDecorator
เป็นProxy
?
public class TwoYearsInTheIndustry implements JobSeeker {
private final Newbie newbie = new Newbie();
@Override
public int interviewScore() {
return newbie.interviewScore() + 20;
}
}
นี่เป็นตัวเลือกและเน้นว่ารูปแบบเหล่านี้อยู่ใกล้แค่ไหน พวกเขายังคงมีไว้สำหรับสถานการณ์ที่แตกต่างกันตามที่อธิบายไว้ในคำตอบอื่น ๆ