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

House brickHouse = new BrickHouse(); 

  System.out.println(brickHouse.getInfo());
  System.out.println(brickHouse.getPrice());
                    

Rumah bata

20000


House brickHouse = new BrickHouse(); 

  brickHouse = new SecondFloor(brickHouse); 

  System.out.println(brickHouse.getInfo());
  System.out.println(brickHouse.getPrice());
                    

Rumah Bata + tingkat dua

40000


House brickHouse = new BrickHouse();
 

  brickHouse = new SecondFloor(brickHouse);
  brickHouse = new Garage(brickHouse);

  System.out.println(brickHouse.getInfo());
  System.out.println(brickHouse.getPrice());
                    

Rumah Bata + tingkat dua + garaj

45000


House woodenHouse = new SecondFloor(new Garage(new WoodenHouse())); 

  System.out.println(woodenHouse.getInfo());
  System.out.println(woodenHouse.getPrice());
                    

Rumah Kayu + garaj + tingkat dua

50000


House woodenHouse = new WoodenHouse(); 

  House woodenHouseWithGarage = new Garage(woodenHouse);

  System.out.println(woodenHouse.getInfo());
  System.out.println(woodenHouse.getPrice());

  System.out.println(woodenHouseWithGarage.getInfo());
  System.out.println(woodenHouseWithGarage.getPrice());
                    

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.