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?