Memahami dan menggunakan pola desain dapat menumbuhkan kebiasaan pemrograman kami yang berorientasi objek yang baik, dan dalam aplikasi yang sebenarnya, kita dapat menikmati kesenangan menjadi nyaman.
Proxy adalah model yang relatif berguna, dan ada banyak varian. Dijelaskan sebagai: Dari titik awal ke ada lapisan menengah antara tujuan, yang berarti agen.
Didefinisikan dalam Pola Desain: Menyediakan proxy untuk objek lain untuk mengontrol akses ke objek ini.
Mengapa menggunakan mode proxy
1. Mekanisme otorisasi Pengguna yang berbeda dari otorisasi memiliki hak akses yang berbeda untuk objek yang sama. (Pengguna yang tidak terdaftar), dan di Jive ini memungkinkan Anda untuk mengontrol hak akses kedua pengguna ini ke forum melalui proxy seperti ForumProxy.
2. Klien tidak dapat beroperasi langsung ke suatu objek, tetapi harus berinteraksi dengan objek itu.
Berikan dua contoh spesifik:
1. Jika objek adalah gambar besar dan butuh waktu lama untuk menampilkannya, maka ketika gambar disertakan dalam dokumen, gunakan editor atau browser untuk membuka dokumen, dan dokumen harus dibuka dengan sangat cepat dan tidak bisa menunggu . Pemrosesan gambar besar selesai, dan saat ini, proxy gambar perlu digunakan untuk mengganti gambar yang sebenarnya.
2. Jika objek itu ada di server jarak jauh di internet dan secara langsung mengoperasikan objek ini mungkin lambat karena kecepatan jaringan, maka kita dapat menggunakan proxy untuk mengganti objek itu terlebih dahulu.
Singkatnya, prinsipnya adalah bahwa untuk objek dengan overhead tinggi, mereka dibuat hanya saat menggunakannya. Oleh karena itu, beberapa orang berpikir bahwa Java mengkonsumsi memori sumber daya, dan saya pikir ini ada hubungannya dengan ide pemrograman.
Cara menggunakan mode proxy
Mengambil sistem Jive Forum sebagai contoh, ada banyak jenis pengguna yang mengunjungi sistem forum: pengguna biasa yang terdaftar, manajer forum, manajer sistem, dan wisatawan. Hanya dengan mendaftarkan pengguna biasa yang dapat berbicara.
Forum adalah antarmuka inti Jive.
Pengguna dengan berbagai tingkat izin didefinisikan dalam forumpermissions:
Salinan kode adalah sebagai berikut:
Forumpermissions kelas publik mengimplementasikan {
/**
* Izin untuk membaca objek.
*/
Public static final int read = 0;
/**
* Izin untuk administrator seluruh sistem.
*/
Public Static Int System_Admin = 1;
/**
* Izin untuk administrator forum tertentu.
*/
forum final forum forum forum public = 2;
/**
* Izin untuk administrator pengguna tertentu.
*/
Public Static Int User_Admin = 3;
/**
* Izin untuk administrator grup tertentu.
*/
Public static int int group_admin = 4;
/**
* Izin untuk memodernasi utas.
*/
final public static int moderate_threads = 5;
/**
* Izin untuk membuat utas baru.
*/
public static final int create_thread = 6;
/**
* Izin untuk membuat pesan baru.
*/
public static final int create_message = 7;
/**
* Izin untuk pesan modern.
*/
final public static int moderate_messages = 8;
.....
public boolean issystemorforumadmin () {
return (values [forum_admin] || values [system_admin]);
}
.....
}
Oleh karena itu, berbagai izin operasi di forum terkait dengan tingkat pengguna yang ditentukan oleh forumpermissions. Misalnya, saat memodifikasi nama forum, hanya manajer forum atau manajer sistem yang dapat memodifikasinya, kodenya adalah sebagai berikut:
Salinan kode adalah sebagai berikut:
Forum Forum Public Public mengimplementasikan forum {
izin forum forum pribadi;
forum forum pribadi;
this.authorization = otorisasi;
Forum PublicProxy (Forum Forum, Otorisasi Otorisasi,
Izin forumpermisi) {
this.forum = forum;
this.authorization = otorisasi;
this.permissions = izin;
}
.....
public void setName (nama string) melempar ExhorizedException yang tidak sah,
ForumalReadyExistSException {
// Hanya administrator sistem atau forum yang dapat memodifikasi nama jika (izin.issystemorforumadmin ()) {
forum.setname (nama);
}
kalau tidak {
Lemparkan EXCHORITEDException yang baru ();
}
}
...
}
DBForum adalah implementasi nyata dari Forum Antarmuka.
Salinan kode adalah sebagai berikut:
Kelas Publik DBForum mengimplementasikan Forum, Cachable {
...
public void setName (nama string) melempar forumalreadyexistsException {
...
this.name = name;
// Di sini Anda benar -benar menyimpan nama baru ke database ke savetodb ();
...
}
...
}
Setiap kali peristiwa memodifikasi nama forum, program -program lain harus terlebih dahulu berurusan dengan ForumProxy.
Dalam aplikasi harian, tidak dapat dihindari bahwa otorisasi sistem atau sistem keamanan akan selalu terlibat.
Mari kita terus berbicara lebih dalam dalam kombinasi dengan Jive, dan model pabrik akan terlibat di bawah ini.
Kami sudah tahu bahwa menggunakan forum membutuhkan penggunaan ForumProxy. Singleton digunakan di sini (juga salah satu pola desain), getInstance () returns forumfactoryproxy.
Mengapa tidak mengembalikan ForumFactory, tetapi Return ForumFactory Implementasi ForumFactoryProxy? Alasannya jelas, dan perlu untuk menentukan apakah forum memiliki izin untuk membuatnya melalui proxy.
Di ForumFactoryProxy kita melihat kode sebagai berikut:
Salinan kode adalah sebagai berikut:
Kelas Publik ForumFactoryProxy memperluas ForumFactory {
Pabrik Forum Forum yang Dilindungi;
Otorisasi yang dilindungi;
Izin Perumahan Forum yang Dilindungi;
Public ForumFactoryProxy (Otorisasi Otorisasi, ForumFactory Factory, ForumPerMissions Izin) {
this. factory = pabrik;
this.authorization = otorisasi;
this.permissions = izin;
}
forum publik createForum (nama string, deskripsi string)
melempar ExhorizedException, ForumalReadyExistSException {
// Hanya administrator sistem yang dapat membuat forum
if (permissions.get (forumpermissions.system_admin)) {
Forum newforum = factory.createForum (nama, deskripsi);
mengembalikan ForumProxy baru (Newforum, Otorisasi, Izin);
}
kalau tidak {
Lemparkan EXCHORITEDException yang baru ();
}
}
}
Metode CreateForum Mengembalikan ForumProxy.
Perhatikan bahwa ada dua proksi di sini: ForumProxy dan ForumFactoryProxy. Mewakili dua tanggung jawab yang berbeda: menggunakan forum dan membuat forum. Adapun mengapa menggunakan objek dipisahkan dari membuat objek, inilah sebabnya pola pabrik digunakan: ini untuk "enkapsulasi" dan "pengiriman". Dengan kata lain, fungsinya sama lajang untuk memfasilitasi pemeliharaan dan modifikasi.
Pembuatan dan penggunaan posting lainnya dalam sistem forum jive didasarkan pada ide forum.
Di atas kami membahas cara menggunakan proxy untuk akses ke mekanisme otorisasi. Menyalin objek yang sangat besar dan kompleks adalah operasi yang sangat mahal. Gunakan proxy untuk menunda proses salinan ini.
Misalnya: kami memiliki koleksi besar, seperti Hashtable, dan banyak klien akan mengaksesnya secara bersamaan pada saat yang sama. Salah satu klien khusus perlu melakukan akuisisi data berkelanjutan, dan pada saat ini, klien lain diharuskan untuk tidak lagi menambahkan atau menghapus hal -hal ke hashtable.
Solusi yang paling langsung adalah: Gunakan kunci koleksi, biarkan klien khusus ini mendapatkan kunci ini, melakukan akuisisi data berkelanjutan, dan kemudian lepaskan kunci.
Salinan kode adalah sebagai berikut:
public void fofetches (hashtable ht) {
disinkronkan (ht) {
// Tindakan akuisisi data kontinu spesifik ...
}
}
Namun, metode ini dapat mengunci koleksi untuk waktu yang lama, dan klien lain tidak akan dapat mengakses koleksi selama periode ini.
Solusi kedua adalah untuk menutup pengumpulan, dan kemudian membiarkan data kontinu mendapatkan operasi pengumpulan untuk klon. Solusi ini didasarkan pada fakta bahwa koleksi tersebut dapat dikloning dan harus ada metode untuk memberikan klon yang dalam. Hashtable menyediakan metode klonnya sendiri, tetapi bukan klon dari objek kunci dan nilai.
Salinan kode adalah sebagai berikut:
public void fofetches (hashtable ht) {
Hashttable newHt = (hashtable) ht.clone ();
}
Masalahnya datang lagi.
Solusi terakhir: Kami dapat menunggu sampai klien lain telah menyelesaikan modifikasi sebelum mengkloning, yaitu, klien khusus ini pertama -tama melakukan serangkaian operasi akuisisi data dengan memanggil metode yang disebut Clone. Namun pada kenyataannya, tidak ada penyalinan objek yang benar -benar dilakukan sampai klien lain memodifikasi pengumpulan objek.
Terapkan solusi ini menggunakan proxy, yang merupakan operasi copy-on-write.
Proxy memiliki berbagai aplikasi.