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 LoggingDBAuthorizationdan 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 Decoratortidak 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 Decoratorsebagai 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.