Meskipun Programmer
Pola Desain: Pola Struktur Kelas dan Objek Desain
Adaptor, Dekorator, Proksi, Pakar Informasi, Komposit, Jembatan, Kopling Rendah, Kelas Terbang, Variasi Terlindungi, dan Fasad
Pola desain struktural berkaitan dengan bagaimana kelas dan objek dapat disusun, untuk membentuk struktur yang lebih besar. Pola ini memungkinkan Anda membuat sistem tanpa menulis ulang atau menyesuaikan kode karena pola ini memberikan sistem kemampuan untuk digunakan kembali dan fungsionalitas yang kuat.
Masing-masing pola menggambarkan masalah yang terjadi berulang-ulang di lingkungan kita, dan kemudian menjelaskan inti solusi terhadap masalah tersebut, sedemikian rupa sehingga Anda dapat menggunakan solusi ini jutaan kali, tanpa harus mengulanginya dengan cara yang sama dua kali. . —Christopher Alexander
Ada 10 jenis pola desain struktural berikut ini.
- Pola Adaptor
- Pola Jembatan
- Pola Komposit
- Pola Dekorator
- Kopling Rendah
- Pola Kelas Terbang
- Pola Fasad
- Pola Proksi
- Pakar Informasi
- Variasi yang Dilindungi
ABCD (Adaptor, Jembatan, Komposit, Dekorator)
Pola Adaptor
Niat
Pola Adaptor adalah pola desain struktural yang memungkinkan objek dengan antarmuka yang tidak kompatibel untuk bekerja sama.
Solusi
Ia mengimplementasikan antarmuka yang dikenal oleh kliennya dan menyediakan akses ke sebuah instance dari kelas yang tidak diketahui oleh kliennya.
- AdapterClient: klien kode.
- Adapter: kelas Adaptor yang meneruskan panggilan ke penerima adaptasi.
- Orang yang beradaptasi: kode lama perlu diadaptasi.
- Target: antarmuka baru untuk mendukung.
Contoh dunia nyata
Daya aslinya adalah 220 voltase, dan perlu disesuaikan dengan 100 voltase agar dapat berfungsi.
Kode berikut memecahkan masalah ini. Ini mendefinisikan HighVoltagePlug
(adaptor), antarmuka Plug
(target), AdapterPlug
(adaptor).
Target: Plug.java
public interface Plug { public int recharge(); }
Adaptor: HighVoltagePlug.java
public class HighVoltagePlug{ public int recharge() { //Power is 220 Voltage return 220; } }
Adaptor: AdapterPlug.java
public class AdapterPlug implements Plug { @Override public int recharge() { HighVoltagePlug bigplug = new HighVoltagePlug(); int v = bigplug.recharge(); v = v - 120; return v; } }
Klien Adaptor: Klien Adaptor.java
public class AdapterClient { public static void main(String[] args) { HighVoltagePlug oldPlug = new HighVoltagePlug(); System.out.println(plug.recharge() + " too much voltage"); Plug newPlug = new AdapterPlug(); System.out.println("Adapter into " + plug.recharge() + " voltage"); } }
Kasus penggunaan
Ketika Anda ingin menggunakan kelas yang sudah ada, dan antarmukanya tidak sesuai dengan antarmuka yang Anda butuhkan.
Saat Anda ingin membuat kelas yang dapat digunakan kembali dan bekerja sama dengan
kelas yang tidak terkait atau tidak terduga, yaitu kelas yang belum tentu memiliki
antarmuka yang kompatibel.
Dimana penerjemahan antarmuka antar berbagai sumber harus terjadi.
Pola Jembatan
Niat
Ini membagi komponen kompleks menjadi dua hierarki pewarisan yang terpisah namun terkait: abstraksi fungsional dan implementasi internal.
Solusi
Diagram berikut menunjukkan kemungkinan penerapan jembatan.
- Abstraksi: ini adalah komponen abstraksi.
- Pelaksana: ini adalah implementasi abstrak.
- RefinedAbstraction: ini adalah komponen yang disempurnakan.
- ConcreateImplementors: itulah implementasi konkritnya.
Contoh dunia nyata
Orang yang berbeda dapat mengenakan pakaian yang berbeda seperti pria, wanita, laki-laki, dan perempuan.
Impl Abstrak: Person.java
public abstract class Person { protected String name; protected Clothing cloth; public Person(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Clothing getCloth() { return cloth; } public void setCloth(Clothing cloth) { this.cloth = cloth; } }
Pelaksana: Clothing.java
public abstract class Clothing { protected String name; public Clothing(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
ConcreateImplementor: Jacket.java
public class Jacket extends Clothing { public Jacket(String name) { super(name); } }
Abstraksi Sempurna: Woman.java
public class Woman extends Person { public Woman(String name) { super(name); } @Override public void dress() { System.out.println(name + " wear " + cloth.getName()); } }
Klien: BridgeClient.java
public class BridgeClient { public static void main(String[] args) { Person woman = new Woman("Woman"); Clothing jacket = new Jacket("Jacket"); // a woman wear jacket woman.setCloth(jacket); woman.dress(); } }
Kasus penggunaan
Menghindari pengikatan permanen antara abstraksi dan implementasinya.
Abstraksi dan implementasinya harus dapat diperluas menggunakan subkelas.
Perubahan dalam implementasi abstraksi tidak boleh berdampak pada klien; artinya, Anda tidak perlu mengkompilasi ulang kodenya.
Pola Komposit
Niat
Pola Komposit memungkinkan Anda membuat struktur pohon hierarki dengan kompleksitas yang berbeda-beda sekaligus memungkinkan setiap elemen dalam struktur beroperasi dengan antarmuka yang seragam.
Solusi
Pola Komposit menggabungkan objek ke dalam struktur pohon untuk mewakili keseluruhan hierarki atau sebagian dari hierarki.
- Komponen adalah abstraksi untuk daun dan komposit. Ini mendefinisikan antarmuka yang harus diimplementasikan oleh objek dalam komposisi.
- Daun adalah benda yang tidak mempunyai anak. Mereka mengimplementasikan layanan yang dijelaskan oleh antarmuka Komponen.
- Komposit menyimpan komponen turunan selain metode implementasi yang ditentukan oleh antarmuka komponen. Komposit mengimplementasikan metode yang ditentukan dalam antarmuka Komponen dengan mendelegasikan ke komponen turunan. Selain itu, komposit menyediakan metode tambahan untuk menambah, menghilangkan, serta mendapatkan komponen.
- Klien memanipulasi objek dalam hierarki menggunakan antarmuka komponen.
Contoh dunia nyata
Dalam suatu organisasi, ada manajer umum dan di bawah manajer umum, bisa ada manajer, dan di bawah manajer bisa ada pengembang. Sekarang Anda dapat mengatur struktur pohon dan meminta setiap node untuk melakukan operasi umum seperti printStructures()
.
Komponen: IEmployee.java
interface IEmployee { void printStructures(); int getEmployeeCount(); }
Komposit: CompositeEmployee.java
class CompositeEmployee implements IEmployee { private int employeeCount=0; private String name; private String dept; //The container for child objects private List<IEmployee> controls; public CompositeEmployee(String name, String dept){ this.name = name; this.dept = dept; controls = new ArrayList<IEmployee>(); } public void addEmployee(IEmployee e){ controls.add(e); } public void removeEmployee(IEmployee e){ controls.remove(e); } @Override public void printStructures(){ System.out.println("\t" + this.name + " works in " + this.dept); for(IEmployee e: controls){ e.printStructures(); } } @Override public int getEmployeeCount(){ employeeCount=controls.size(); for(IEmployee e: controls){ employeeCount+=e.getEmployeeCount(); } return employeeCount; } }
Daun: Employee.java
class Employee implements IEmployee{ private String name; private String dept; private int employeeCount=0; public Employee(String name, String dept){ this.name = name; his.dept = dept; } @Override public void printStructures(){ System.out.println("\t\t"+this.name + " works in " + this.dept); } @Override public int getEmployeeCount(){ return employeeCount; } }
Kasus penggunaan
Anda ingin mewakili keseluruhan hierarki atau bagian dari hierarki objek; dimana klien untuk dapat mengabaikan perbedaan antara komposisi objek dan objek individu.
Anda dapat menerapkan pola ini dengan struktur yang memiliki tingkat kerumitan apa pun.
Pola Dekorator
Niat
Pola Dekorator memungkinkan Anda menambah atau menghapus fungsionalitas objek tanpa mengubah tampilan luar atau fungsi objek.
Solusi
Ini mengubah fungsionalitas suatu objek dengan cara yang transparan bagi kliennya dengan menggunakan turunan subkelas dari kelas asli yang mendelegasikan operasi ke objek asli.
- Komponen adalah Antarmuka untuk objek yang dapat memiliki tanggung jawab yang ditambahkan secara dinamis.
- ConcreteComponent mendefinisikan objek yang dapat ditambahkan tanggung jawab tambahan.
- Decorator memelihara referensi ke objek Komponen dan mendefinisikan antarmuka yang sesuai dengan antarmuka Komponen.
- ConcreteDecorators memperluas fungsionalitas komponen dengan menambahkan status atau menambahkan perilaku.
Contoh dunia nyata
Anda sudah memiliki rumah. Sekarang Anda telah memutuskan untuk membangun lantai tambahan di atasnya. Anda mungkin ingin mengubah desain arsitektur untuk lantai yang baru ditambahkan tanpa mempengaruhi arsitektur yang sudah ada seperti tidak mengubah arsitektur lantai dasar (atau lantai yang sudah ada).
Kasus penggunaan
Saat menambahkan tanggung jawab ke objek individual secara dinamis dan transparan tanpa memengaruhi objek lain.
Ketika Anda ingin menambahkan tanggung jawab pada objek yang mungkin ingin Anda ubah di masa depan.
Dimana perluasan dengan subkelas statis tidak praktis.
F2P (Kelas Terbang, Fasad, Proksi)
Pola Kelas Terbang
Niat
Pola Flyweight mengurangi jumlah objek tingkat rendah dan detail dalam sistem dengan berbagi objek.
Solusi
Diagram berikut menunjukkan bahwa objek kelas terbang dikembalikan dari kumpulan dan agar berfungsi, ia memerlukan status eksternal yang diteruskan sebagai argumen.
- Klien: kode klien.
- FlyweightFactory: ini menciptakan kelas terbang jika tidak ada dan mengembalikannya dari kumpulan jika ada.
- Kelas Terbang: kelas terbang abstrak.
- ConcreateFlyweight: kelas terbang yang dirancang untuk memiliki status bersama dengan rekan-rekannya.
Contoh dunia nyata
Contoh klasik penggunaan ini ada pada pengolah kata. Di sini, setiap karakter adalah objek kelas terbang yang berbagi data yang diperlukan untuk rendering. Akibatnya, hanya posisi karakter di dalam dokumen yang memakan memori tambahan.
Kasus penggunaan
Anda sebaiknya menggunakan pola Flyweight ketika semua hal berikut ini benar.
- Aplikasi ini menggunakan sejumlah besar objek.
- Biaya penyimpanan tinggi karena kuantitas benda.
- Aplikasi tidak bergantung pada identitas objek.
Pola Fasad
Niat
Pola Façade menyediakan antarmuka terpadu ke sekelompok antarmuka dalam suatu subsistem.
Solusi
Ini mendefinisikan antarmuka tingkat tinggi yang membuat subsistem lebih mudah digunakan karena Anda hanya memiliki satu antarmuka.
Contoh dunia nyata
Fasad mendefinisikan antarmuka terpadu tingkat tinggi ke subsistem yang membuatnya lebih mudah digunakan. Konsumen menemukan Fasad saat memesan dari katalog. Konsumen menghubungi satu nomor dan berbicara dengan perwakilan layanan pelanggan. Perwakilan layanan pelanggan bertindak sebagai Fasad, menyediakan antarmuka ke departemen pemenuhan pesanan, departemen penagihan, dan departemen pengiriman.
Kasus penggunaan
Bila Anda ingin menyediakan antarmuka sederhana ke subsistem yang kompleks.
Jika ada banyak ketergantungan antara klien dan kelas implementasi abstraksi
Saat Anda ingin melapisi subsistem Anda.
Pola Proksi
Ada beberapa jenis implementasi pola Proxy, dengan Proksi jarak jauh dan Proksi virtual menjadi yang paling umum.
Niat
Pola Proxy menyediakan objek pengganti atau placeholder untuk mengontrol akses ke objek asli.
Solusi
Contoh dunia nyata
Contoh nyatanya adalah cek atau kartu kredit yang merupakan proxy dari apa yang ada di rekening bank kita. Ini dapat digunakan sebagai pengganti uang tunai dan menyediakan sarana untuk mengakses uang tunai tersebut bila diperlukan. Dan itulah yang dilakukan oleh pola Proxy — “Mengontrol dan mengelola akses ke objek yang mereka lindungi”.
Kasus penggunaan
Anda memerlukan referensi yang lebih serbaguna atau canggih ke suatu objek daripada penunjuk sederhana.
pola GAMBAR
GRASP menyebutkan dan menjelaskan prinsip dasar untuk menetapkan tanggung jawab.
Pakar Informasi
Kami melihat Pola Pakar (atau Pola Pakar Informasi). Yang ini cukup sederhana namun sangat penting.
Niat
Apa prinsip dasar untuk menugaskan tanggung jawab pada objek?
Solusi
Tetapkan tanggung jawab kepada kelas yang memiliki informasi yang diperlukan untuk memenuhinya.
Contoh dunia nyata
Misalnya saja permainan Monopoli. Misalkan sebuah objek ingin mereferensikan sebuah Kotak, mengingat namanya. Siapa yang bertanggung jawab untuk mengetahui Alun-alun, mengingat namanya?
Kandidat yang paling mungkin adalah Dewan karena terdiri dari Kotak.
Karena Dewan terdiri dari Kotak, maka objek inilah yang paling cocok untuk menghasilkan kotak tertentu sesuai dengan nama kotak tersebut — Dewan adalah Pakar Informasi, yang memiliki semua informasi yang diperlukan untuk memenuhi tanggung jawab ini.
Kasus penggunaan
Bayangkan objek dalam model desain Anda sebagai pekerja yang Anda kelola. Jika Anda mempunyai tugas untuk diberikan, kepada siapa Anda memberikannya?
- Anda memberikannya kepada orang yang memiliki pengetahuan terbaik untuk melakukan tugas tersebut.
- Terkadang pengetahuan untuk mengerjakan tugas tersebar pada beberapa objek
Berinteraksi melalui beberapa pesan untuk mengerjakan tugas, namun biasanya ada satu objek yang bertanggung jawab atas penyelesaian tugas.
Variasi yang Dilindungi
Niat
Bagaimana merancang objek, subsistem, dan sistem sehingga variasi atau ketidakstabilan elemen-elemen tersebut tidak menimbulkan dampak yang tidak diinginkan pada elemen lainnya?
Solusi
Identifikasi titik-titik perkiraan variasi atau ketidakstabilan, tetapkan tanggung jawab untuk menciptakan antarmuka yang stabil di sekitarnya.
Prinsip “Jangan bicara dengan orang asing”, yang menyatakan bahwa metode suatu objek hanya boleh mengirim pesan (yaitu menggunakan metode) dari objek yang dikenalnya secara langsung.
Contoh dunia nyata
Enkapsulasi data, antarmuka, polimorfisme, tipuan, dan standar dimotivasi oleh Variasi yang Dilindungi.
Kasus penggunaan
Variasi yang Dilindungi adalah prinsip dasar yang memotivasi sebagian besar mekanisme dan pola dalam pemrograman dan desain untuk memberikan fleksibilitas dan perlindungan dari variasi data, perilaku, perangkat keras, komponen perangkat lunak, sistem operasi, dan banyak lagi.
Kesimpulan
Pola struktural mempengaruhi aplikasi dalam berbagai cara, misalnya, pola Adaptor memungkinkan dua sistem yang tidak kompatibel untuk berkomunikasi, sedangkan pola Fasad memungkinkan Anda menyajikan antarmuka yang disederhanakan kepada pengguna tanpa menghapus semua opsi yang tersedia dalam sistem.
Mudah, bukan?