Pengantar Design Pattern Tio Dharmawan Fakultas Ilmu Komputer 2024
Review OOP So a class is like a blueprint that defines the structure for objects , which are concrete instances of that class.
Class Hierarchy Detailed Simple
Pillars of OOP
Pillars of OOP: Abstraction Abstraksi adalah model dari objek atau fenomena dunia nyata yang dibatasi pada konteks tertentu , yang mewakili semua detail yang relevan dengan konteks tersebut dengan tingkat akurasi yang tinggi dan menghilangkan semua detail lain yang tidak relevan . Abstraksi memungkinkan kita untuk fokus pada aspek-aspek penting dari suatu objek atau fenomena tanpa terganggu oleh informasi yang tidak penting , sehingga memudahkan pemahaman dan analisis .
Contoh Program: Abstract Account Class public abstract class Account { protected String accountNumber ; protected double balance; public Account(String accountNumber , double balance) { this.accountNumber = accountNumber ; this.balance = balance; } public abstract void deposit(double amount); public abstract void withdraw(double amount); public double getBalance () { return balance; } }
Contoh Program: Customer Class import java.util.ArrayList ; import java.util.List ; public class Customer { private String customerID ; private String name; private List<Account> accounts; public Customer(String customerID , String name) { this.customerID = customerID ; this.name = name; this.accounts = new ArrayList <>(); } public void addAccount (Account account) { accounts.add (account); } public List<Account> getAccounts () { return accounts; } }
Contoh Program: Blank Class import java.util.ArrayList ; import java.util.List ; public class Bank { private String name; private List<Customer> customers; public Bank(String name) { this.name = name; this.customers = new ArrayList <>(); } public void addCustomer (Customer customer) { customers.add (customer); } public List<Customer> listCustomers () { return customers; } }
Contoh Program: Main Class public class Main { public static void main(String[] args ) { Bank bank = new Bank("Example Bank"); Customer customer = new Customer("123", "John Doe"); bank.addCustomer (customer); Account savings = new SavingsAccount ("001", 1000.0, 2.5); customer.addAccount (savings); savings.deposit (500); savings.withdraw (200); (( SavingsAccount ) savings). calculateInterest (); System.out.println ("Balance: " + savings.getBalance ()); } }
Pillars of OOP: Encapsulation Inheritance adalah mekanisme dalam pemrograman berorientasi objek yang memungkinkan pembuatan kelas baru berdasarkan kelas yang sudah ada . Hal ini memungkinkan penggunaan kembali kode , mengurangi redundansi , dan memperluas fungsionalitas tanpa menulis ulang kode . Subkelas yang dihasilkan secara otomatis mewarisi atribut dan metode dari kelas induknya , memudahkan pengembangan dan pemeliharaan . Pewarisan meningkatkan modularitas dan fleksibilitas dalam pengembangan perangkat lunak , memfasilitasi pembuatan hierarki kelas yang efisien .
Contoh Program public interface FlyingTransport { void fly(String origin, String destination, int passengers); } public class Helicopter implements FlyingTransport { @Override public void fly(String origin, String destination, int passengers) { System.out.println ("Helicopter flying from " + origin + " to " + destination + " with " + passengers + " passengers."); } } public class Airplane implements FlyingTransport { @Override public void fly(String origin, String destination, int passengers) { System.out.println ("Airplane flying from " + origin + " to " + destination + " with " + passengers + " passengers."); } } public class Airport { public void accept( FlyingTransport vehicle) { vehicle.fly ("New York", "London", 150); // Example usage } }
Pillars of OOP: Inheritance Inheritance adalah mekanisme dalam pemrograman berorientasi objek yang memungkinkan pembuatan kelas baru berdasarkan kelas yang sudah ada . Hal ini memungkinkan penggunaan kembali kode , mengurangi redundansi , dan memperluas fungsionalitas tanpa menulis ulang kode . Subkelas yang dihasilkan secara otomatis mewarisi atribut dan metode dari kelas induknya , memudahkan pengembangan dan pemeliharaan . Inheritance meningkatkan modularitas dan fleksibilitas dalam pengembangan perangkat lunak , memfasilitasi pembuatan hierarki kelas yang efisien .
Contoh public interface FourLegged { void run(String destination); } public interface OxygenBreather { void breathe(); } public class Cat extends Animal implements FourLegged , OxygenBreather { @Override public void run(String destination) { System.out.println ("Cat runs to " + destination); } @Override public void breathe() { System.out.println ("Cat breathes in and out."); } // Metode spesifik kucing public void meow() { System.out.println ("Cat says 'meow'"); } }
Contoh public class Main { public static void main(String[] args ) { Cat myCat = new Cat(); myCat.eat (); // Diwarisi dari Animal myCat.run ("backyard"); // Implementasi dari FourLegged myCat.breathe (); // Implementasi dari OxygenBreather myCat.meow (); // Metode spesifik Cat } }
Pillars of OOP: Polymorphism Polimorfisme adalah kemampuan sebuah program untuk mendeteksi kelas sebenarnya dari suatu objek dan memanggil implementasinya meskipun tipe sebenarnya tidak diketahui dalam konteks saat ini . Konsep ini memungkinkan objek dari kelas yang berbeda untuk diolah melalui antarmuka yang sama . Metode yang sama dapat memiliki perilaku yang berbeda pada objek yang berbeda , tergantung pada kelas objek tersebut . Hal ini sangat berguna untuk membuat kode yang lebih modular dan mudah untuk dikelola .
Contoh public abstract class Animal { public abstract void makeSound (); } public class Cat extends Animal { @Override public void makeSound () { System.out.println ("Meow!"); } } public class Dog extends Animal { @Override public void makeSound () { System.out.println ("Woof!"); } } public class Main { public static void main(String[] args ) { Animal myCat = new Cat(); Animal myDog = new Dog(); myCat.makeSound (); // Output: Meow! myDog.makeSound (); // Output: Woof! } }
Relations Between Objects: Association Association dalam diagram kelas UML menggambarkan hubungan di mana satu objek menggunakan atau berinteraksi dengan objek lain. Dalam diagram UML, hubungan asosiasi ditunjukkan dengan panah sederhana yang ditarik dari satu objek dan menunjuk ke objek yang digunakan . Asosiasi bisa bersifat dua arah , yang dalam hal ini , panah akan memiliki titik di kedua ujungnya , menunjukkan bahwa kedua objek saling berinteraksi atau menggunakan satu sama lain. Hubungan ini membantu dalam menggambarkan bagaimana berbagai kelas dalam sebuah sistem saling terkait dan berkomunikasi .
Relations Between Objects: Dependency Dependensi dalam diagram kelas UML merupakan varian yang lebih lemah dari asosiasi , yang biasanya menunjukkan tidak adanya tautan permanen antar objek . Dependensi seringkali ( tetapi tidak selalu ) mengimplikasikan bahwa suatu objek menerima objek lain sebagai parameter metode , menginstansiasi , atau menggunakan objek lain. Anda dapat mengidentifikasi dependensi antar kelas jika perubahan pada definisi satu kelas mengakibatkan modifikasi pada kelas lain. Hubungan ini menunjukkan bahwa satu kelas bergantung pada kelas lain dalam konteks tertentu , namun tidak memiliki kepemilikan atau keterkaitan yang berkelanjutan .
Relations Between Objects: Composition Relasi komposisi dalam diagram kelas UML adalah hubungan " utuh-bagian " antara dua objek , di mana salah satu objek terdiri dari satu atau lebih instansi dari objek lain. Perbedaan utama dalam hubungan ini dibandingkan dengan hubungan lainnya adalah bahwa komponen hanya dapat eksis sebagai bagian dari wadahnya . Dalam UML, hubungan komposisi ditunjukkan dengan garis yang memiliki berlian terisi di ujung wadah dan panah di ujung yang mengarah ke komponen . Ini menandakan bahwa jika wadah dihancurkan , maka komponen yang merupakan bagian dari wadah tersebut juga akan dihancurkan , menunjukkan ketergantungan yang kuat antara wadah dan komponennya .
Relations Between Objects: Aggregation Relasi agregasi dalam diagram kelas UML adalah varian yang lebih longgar dari komposisi , di mana satu objek hanya berisi referensi ke objek lain tanpa mengontrol siklus hidup dari komponen tersebut . Komponen dapat eksis tanpa wadah dan dapat terkait dengan beberapa wadah secara bersamaan . Dalam UML, hubungan agregasi digambarkan sama seperti komposisi , tetapi dengan berlian kosong di dasar panah . Hal ini menunjukkan bahwa meskipun ada hubungan kepemilikan antara wadah dan komponen , komponen tersebut memiliki otonomi lebih besar dan dapat berpartisipasi dalam hubungan dengan objek lain di luar wadah aslinya .
What’s a Design Pattern? Design Pattern merupakan solusi standar untuk mengatasi permasalahan yang sering muncul dalam pengembangan perangkat lunak . Pola- pola ini berfungsi sebagai blueprint yang dapat diadaptasi untuk menangani masalah desain yang berulang-ulang muncul dalam pengkodean . Design Pattern memfasilitasi strukturisasi kode yang tidak hanya meningkatkan kejelasan dan kemudahan pemeliharaan tetapi juga mempercepat proses pengembangan dengan menyediakan strategi yang telah teruji . Penggunaan Design Pattern memungkinkan pengembang untuk menghindari kesalahan yang sering terjadi dan mengoptimalkan efisiensi pengembangan dengan menerapkan metode yang telah diakui keefektifannya .
Group of Patterns: Creational Patterns Creational Pattern berkaitan dengan cara pembuatan objek yang meningkatkan fleksibilitas dan penggunaan kembali kode yang ada . Beberapa pola populer dalam kategori ini meliputi : Singleton: Memastikan kelas memiliki satu instance saja dan menyediakan titik akses global ke instance tersebut . Contoh : penggunaan database connection pool. Factory Method: Mendefinisikan antarmuka untuk membuat objek , tetapi membiarkan subkelas menentukan kelas yang akan diinstansiasi . Contoh : framework pengembangan aplikasi yang memungkinkan penggunaan berbagai jenis database. Builder: Memisahkan konstruksi objek kompleks dari representasinya sehingga proses yang sama dapat menciptakan representasi yang berbeda . Contoh : pembuatan dokumen teks atau HTML dengan cara yang serupa . Prototype: Menciptakan objek berdasarkan instance yang sudah ada melalui kloning . Contoh : duplikasi objek dalam pengeditan grafis . Abstract Factory: Menyediakan antarmuka untuk membuat keluarga objek terkait tanpa menentukan kelas konkret mereka . Contoh : kit GUI yang dapat bekerja di berbagai platform sistem operasi .
Group of Patterns: Structural Patterns Structural Patterns menjelaskan bagaimana menggabungkan objek dan kelas menjadi struktur yang lebih besar , sambil menjaga fleksibilitas dan efisiensi struktur tersebut . Beberapa pola dalam kategori ini adalah : Adapter: Mengizinkan objek dengan antarmuka yang tidak kompatibel bekerja bersama . Contoh : wrapper yang memungkinkan data dari sistem yang berbeda untuk diolah bersama . Composite: Mengkomposisikan objek ke dalam struktur pohon untuk merepresentasikan hierarki part-whole. Contoh : sistem file direktori . Proxy: Menyediakan pengganti atau placeholder untuk objek lain untuk mengontrol akses ke objek tersebut . Contoh : proxy server yang mengontrol akses ke sumber daya jaringan . Facade: Menyediakan antarmuka tingkat tinggi yang menyederhanakan penggunaan sub- sistem yang kompleks . Contoh : pustaka untuk menggambar grafik yang menyederhanakan panggilan ke berbagai metode yang lebih kompleks . Decorator: Menambahkan fungsionalitas ke objek secara dinamis . Contoh : menambahkan enkripsi pada operasi baca / tulis file.
Group of Patterns: Behavioral Patterns Pola Behavioral berfokus pada komunikasi yang efektif dan penugasan tanggung jawab antar objek . Beberapa pola dalam kategori ini termasuk : Observer: Objek memperbarui dirinya sendiri berdasarkan perubahan pada objek lain. Contoh : sistem notifikasi yang menginformasikan pengguna ketika data penting diupdate . Strategy: Memungkinkan penggantian algoritma atau strategi yang digunakan dalam suatu objek di runtime. Contoh : mengganti algoritma enkripsi dalam aplikasi keamanan . Command: Mengemas permintaan sebagai objek , sehingga memungkinkan parameterisasi klien dengan permintaan , antrian , atau operasi . Contoh : operasi undo dalam aplikasi pengeditan . State: Memungkinkan objek mengubah perilakunya ketika status internalnya berubah . Contoh : mengganti mode operasi dalam mesin state. Mediator: Mengurangi ketergantungan langsung antar kelas dengan menjadikan satu kelas yang mengatur bagaimana kelas-kelas tersebut berinteraksi . Contoh : kontrol tower di bandara yang mengatur lalu lintas udara .
Tujuan Design Pattern Setiap design pattern membantu mengatasi tantangan desain yang berbeda . Memungkinkan pengembangan perangkat lunak yang lebih bersih , lebih modular, dan lebih mudah untuk dipelihara .