Kami telah menyemak penggunaan objek tunggal, tetapi anda mungkin belum menyedari bahawa strategi ini ialah corak reka bentuk, dan salah satu yang paling banyak digunakan pada masa itu.
Sebenarnya, terdapat banyak corak ini, dan ia boleh dikelaskan mengikut tujuan khusus mereka.
Pengelasan corak
Jenis corak | Permohonan |
---|---|
ciptaan | Jenis yang menyelesaikan masalah penciptaan objek |
berstruktur | Corak yang membolehkan kami membina hierarki kelas yang betul dan boleh dikembangkan dalam seni bina kami |
Tingkah laku | Kelompok corak ini memudahkan interaksi yang selamat dan mudah antara objek dalam program. |
Biasanya, corak dicirikan oleh masalah yang diselesaikannya. Mari kita lihat beberapa corak yang paling kerap kita temui semasa bekerja dengan Java:
Corak | Tujuan |
---|---|
Singleton | Kami sudah biasa dengan corak ini — kami menggunakannya untuk mencipta dan mengakses kelas yang tidak boleh mempunyai lebih daripada satu tika. |
Iterator | Kami juga biasa dengan yang ini. Kami tahu bahawa corak ini membolehkan kami mengulangi objek koleksi tanpa mendedahkan perwakilan dalamannya. Ia digunakan dengan koleksi. |
Penyesuai | Corak ini menghubungkan objek yang tidak serasi supaya ia boleh berfungsi bersama. Saya fikir nama corak penyesuai membantu anda membayangkan dengan tepat apa yang dilakukannya. Berikut ialah contoh mudah daripada kehidupan sebenar: penyesuai USB untuk salur keluar dinding. |
Kaedah templat |
Corak pengaturcaraan tingkah laku yang menyelesaikan masalah penyepaduan dan membolehkan anda menukar langkah algoritma tanpa mengubah struktur algoritma. Bayangkan kita mempunyai algoritma pemasangan kereta dalam bentuk urutan langkah pemasangan: Casis -> Badan -> Enjin -> Dalaman Kabin Jika kita meletakkan bingkai bertetulang, enjin yang lebih berkuasa atau bahagian dalam dengan pencahayaan tambahan, kita tidak perlu menukar algoritma dan jujukan abstrak tetap sama. |
Penghias | Corak ini mencipta pembungkus untuk objek untuk memberi mereka fungsi yang berguna. Kami akan menganggapnya sebagai sebahagian daripada artikel ini. |
Di Java.io, kelas berikut melaksanakan corak:
Corak | Di mana ia digunakan dalam java.io |
---|---|
Penyesuai |
|
Kaedah templat | |
Penghias |
Corak penghias
Bayangkan kita sedang menerangkan model untuk reka bentuk rumah.
Secara umum, pendekatannya kelihatan seperti ini:
Pada mulanya, kami mempunyai pilihan beberapa jenis rumah. Konfigurasi minimum ialah satu tingkat dengan bumbung. Kemudian kami menggunakan semua jenis penghias untuk menukar parameter tambahan, yang secara semula jadi mempengaruhi harga rumah.
Kami mencipta kelas Rumah abstrak:
public abstract class House {
String info;
public String getInfo() {
return info;
}
public abstract int getPrice();
}
Di sini kami mempunyai 2 kaedah:
- getInfo() mengembalikan maklumat tentang nama dan ciri rumah kami;
- getPrice() mengembalikan harga konfigurasi rumah semasa.
Kami juga mempunyai pelaksanaan Rumah standard - bata dan kayu:
public class BrickHouse extends House {
public BrickHouse() {
info = "Brick House";
}
@Override
public int getPrice() {
return 20_000;
}
}
public class WoodenHouse extends House {
public WoodenHouse() {
info = "Wooden House";
}
@Override
public int getPrice() {
return 25_000;
}
}
Kedua-dua kelas mewarisi kelas House dan mengatasi kaedah harganya, menetapkan harga tersuai untuk rumah standard. Kami menetapkan nama dalam pembina.
Seterusnya, kita perlu menulis kelas penghias. Kelas ini juga akan mewarisi kelas House . Untuk melakukan ini, kami mencipta kelas penghias abstrak.
Di situlah kita akan meletakkan logik tambahan untuk menukar objek. Pada mulanya, tidak akan ada logik tambahan dan kelas abstrak akan kosong.
abstract class HouseDecorator extends House {
}
Seterusnya, kami mencipta pelaksanaan penghias. Kami akan membuat beberapa kelas yang membolehkan kami menambah ciri tambahan pada rumah:
public class SecondFloor extends HouseDecorator {
House house;
public SecondFloor(House house) {
this.house = house;
}
@Override
public int getPrice() {
return house.getPrice() + 20_000;
}
@Override
public String getInfo() {
return house.getInfo() + " + second floor";
}
}
Penghias yang menambah tingkat dua ke rumah kami |
Pembina penghias menerima rumah yang akan kami "hias", iaitu menambah pengubahsuaian. Dan kami mengatasi kaedah getPrice() dan getInfo() , mengembalikan maklumat tentang rumah baharu yang dikemas kini berdasarkan yang lama.
public class Garage extends HouseDecorator {
House house;
public Garage(House house) {
this.house = house;
}
@Override
public int getPrice() {
return house.getPrice() + 5_000;
}
@Override
public String getInfo() {
return house.getInfo() + " + garage";
}
}
Penghias yang menambah garaj ke rumah kami |
Sekarang kita boleh mengemas kini rumah kita dengan penghias. Untuk melakukan ini, kita perlu membuat rumah:
House brickHouse = new BrickHouse();
Seterusnya, kami menetapkan kamirumahpemboleh ubah sama dengan penghias baru, melalui rumah kami:
brickHouse = new SecondFloor(brickHouse);
kamirumahvariable kini adalah sebuah rumah dengan tingkat dua.
Mari lihat kes penggunaan yang melibatkan penghias:
Contoh kod | Pengeluaran |
---|---|
|
Rumah bata 20000 |
|
Rumah Bata + tingkat dua 40000 |
|
Rumah Bata + tingkat dua + garaj 45000 |
|
Rumah Kayu + garaj + tingkat dua 50000 |
|
Rumah kayu 25000 Rumah Kayu + garaj 30000 |
Contoh ini menggambarkan faedah menaik taraf objek dengan penghias. Jadi kami tidak menukarrumah kayuobjek itu sendiri, tetapi sebaliknya mencipta objek baharu berdasarkan objek lama. Di sini kita dapat melihat bahawa kelebihan datang dengan kelemahan: kita mencipta objek baru dalam ingatan setiap kali, meningkatkan penggunaan memori.
Lihat gambarajah UML program kami ini:
Penghias mempunyai pelaksanaan yang sangat mudah dan menukar objek secara dinamik, menaik tarafnya. Penghias boleh dikenali oleh pembina mereka, yang mengambil objek parameter daripada jenis atau antara muka abstrak yang sama seperti kelas semasa. Di Jawa, corak ini digunakan secara meluas dalam kelas I/O.
Sebagai contoh, seperti yang telah kami nyatakan, semua subkelas java.io.InputStream , OutputStream , Reader dan Writer mempunyai pembina yang menerima objek daripada kelas yang sama.
GO TO FULL VERSION