Butuh beberapa saat untuk mencari tahu jawaban ini dan apa artinya sebenarnya. Beberapa contoh harus membuatnya lebih jelas.
Proxy
pertama:
public interface Authorization {
String getToken();
}
Dan:
// goes to the DB and gets a token for example
public class DBAuthorization implements Authorization {
@Override
public String getToken() {
return "DB-Token";
}
}
Dan ada penelepon ini Authorization
, yang sangat bodoh:
class Caller {
void authenticatedUserAction(Authorization authorization) {
System.out.println("doing some action with : " + authorization.getToken());
}
}
Sejauh ini tidak ada yang tidak biasa, bukan? Dapatkan token dari layanan tertentu, gunakan token itu. Sekarang hadir satu persyaratan lagi untuk gambar, tambahkan logging: arti log token setiap kali. Sederhana untuk kasus ini, cukup buat 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;
}
}
Bagaimana kita menggunakannya?
public static void main(String[] args) {
LoggingDBAuthorization loggingDBAuthorization = new LoggingDBAuthorization();
Caller caller = new Caller();
caller.authenticatedUserAction(loggingDBAuthorization);
}
Perhatikan bahwa LoggingDBAuthorization
memegang instance dari DBAuthorization
. Keduanya LoggingDBAuthorization
dan DBAuthorization
implementasikan Authorization
.
- Proxy akan mengadakan implementasi konkret (
DBAuthorization
) antarmuka dasar ( Authorization
). Dengan kata lain Proksi tahu persis apa yang sedang diproksi.
Decorator
:
Dimulai hampir sama dengan Proxy
, dengan antarmuka:
public interface JobSeeker {
int interviewScore();
}
dan implementasi dari itu:
class Newbie implements JobSeeker {
@Override
public int interviewScore() {
return 10;
}
}
Dan sekarang kami ingin menambahkan kandidat yang lebih berpengalaman, yang menambahkan skor wawancara ditambah satu dari yang lain JobSeeker
:
@RequiredArgsConstructor
public class TwoYearsInTheIndustry implements JobSeeker {
private final JobSeeker jobSeeker;
@Override
public int interviewScore() {
return jobSeeker.interviewScore() + 20;
}
}
Perhatikan bagaimana saya mengatakan itu ditambah satu dari JobSeeker lain , bukan Newbie
. A Decorator
tidak tahu persis apa itu dekorasi, ia tahu hanya kontrak contoh yang dihiasi (ia tahu tentang JobSeeker
). Perhatikan di sini bahwa ini tidak seperti Proxy
; sebaliknya, tahu persis apa itu dekorasi.
Anda mungkin mempertanyakan apakah sebenarnya ada perbedaan antara dua pola desain dalam kasus ini? Bagaimana jika kami mencoba menulis Decorator
sebagai Proxy
?
public class TwoYearsInTheIndustry implements JobSeeker {
private final Newbie newbie = new Newbie();
@Override
public int interviewScore() {
return newbie.interviewScore() + 20;
}
}
Ini jelas merupakan pilihan dan menyoroti seberapa dekat pola-pola ini; mereka masih ditujukan untuk skenario yang berbeda seperti yang dijelaskan dalam jawaban lain.