Kita wis dideleng nggunakake obyek singleton, nanging sampeyan bisa uga durung éling sing strategi iki pola desain, lan salah siji sing paling digunakake ing.

Nyatane, ana akeh pola kasebut, lan bisa diklasifikasikake miturut tujuan tartamtu.

Klasifikasi pola

Tipe pola Aplikasi
kreasi Jinis sing ngrampungake masalah nggawe obyek
Struktural Pola sing ngidini kita mbangun hierarki kelas sing bener lan bisa diperluas ing arsitektur kita
Kelakuane Klompok pola iki nggampangake interaksi sing aman lan trep antarane obyek ing program.

Biasane, pola ditondoi dening masalah sing ditanggulangi. Ayo goleki sawetara pola sing asring kita temoni nalika nggarap Jawa:

Pola tujuane
Singleton Kita wis kenal karo pola iki - digunakake kanggo nggawe lan ngakses kelas sing ora bisa duwe luwih saka siji conto.
Iterator Kita uga kenal karo siji iki. Kita ngerti manawa pola iki ngidini kita ngulang obyek koleksi tanpa nuduhake perwakilan internal. Iki digunakake karo koleksi.
Adaptor Pola iki nyambungake obyek sing ora kompatibel supaya bisa kerja bareng. Aku jeneng pola adaptor mbantu mbayangno persis apa iki. Punika conto prasaja saka urip nyata: adaptor USB kanggo stopkontak tembok.
Metode Cithakan

Pola pemrograman prilaku sing ngrampungake masalah integrasi lan ngidini sampeyan ngganti langkah algoritma tanpa ngganti struktur algoritma.

Mbayangno yen kita duwe algoritma perakitan mobil kanthi urutan langkah perakitan:

Sasis -> Badan -> Mesin -> Interior Kabin

Yen kita sijine pigura dikiataken, mesin luwih kuat, utawa interior karo cahya tambahan, kita ora kudu ngganti algoritma, lan urutan abstrak tetep padha.

Dekorator Pola iki nggawe pambungkus kanggo obyek kanggo menehi fungsi migunani. Kita bakal nimbang minangka bagéan saka artikel iki.

Ing Java.io, kelas ing ngisor iki ngetrapake pola:

Pola dekorator

Ayo bayangake yen kita nggambarake model kanggo desain omah.

Umumé, pendekatan katon kaya iki:

Kaping pisanan, kita duwe pilihan sawetara jinis omah. Konfigurasi minimal yaiku siji lantai kanthi atap. Banjur kita nggunakake kabeh jinis dekorator kanggo ngganti paramèter tambahan, sing kanthi alami mengaruhi rega omah.

Kita nggawe kelas House abstrak:


public abstract class House {
	String info;
 
	public String getInfo() {
    	return info;
	}
 
	public abstract int getPrice();
}
    

Ing kene kita duwe 2 cara:

  • getInfo () ngasilake informasi babagan jeneng lan fitur omah kita;
  • getPrice () ngasilake rega konfigurasi omah saiki.

Kita uga duwe implementasine House standar - bata lan 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;
	}
}
    

Loro-lorone kelas kasebut marisi kelas House lan ngilangi cara regane, nyetel rega khusus kanggo omah standar. Kita nyetel jeneng ing konstruktor.

Sabanjure, kita kudu nulis kelas dekorator. Kelas iki uga bakal oleh warisan kelas House . Kanggo nindakake iki, kita nggawe kelas dekorator abstrak.

Ing kana kita bakal menehi logika tambahan kanggo ngganti obyek. Kaping pisanan, ora bakal ana logika tambahan lan kelas abstrak bakal kosong.


abstract class HouseDecorator extends House {
}
    

Sabanjure, kita nggawe implementasi dekorator. Kita bakal nggawe sawetara kelas sing ngidini kita nambah fitur tambahan ing omah:


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";
	}
}
    
Dekorator sing nambah lantai loro ing omah kita

Konstruktor dekorator nampa omah sing bakal "hiasan", yaiku nambah modifikasi. Lan kita ngalahake cara getPrice () lan getInfo () , bali informasi babagan omah anyar dianyari adhedhasar lawas.


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";
	}
}
    
Dekorator sing nambah garasi ing omah kita

Saiki kita bisa nganyari omah kita karo dekorator. Kanggo nindakake iki, kita kudu nggawe omah:


House brickHouse = new BrickHouse();
    

Sabanjure, kita nyetel kitaomahvariabel padha karo dekorator anyar, ngliwati omah kita:


brickHouse = new SecondFloor(brickHouse); 
    

kitaomahvariabel saiki dadi omah kanthi lantai loro.

Ayo goleki kasus panggunaan sing nglibatake dekorator:

Tuladha kode Output

House brickHouse = new BrickHouse(); 

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

Omah bata

20000


House brickHouse = new BrickHouse(); 

  brickHouse = new SecondFloor(brickHouse); 

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

Omah bata + lantai loro

40000


House brickHouse = new BrickHouse();
 

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

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

Omah bata + lantai loro + garasi

45000


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

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

Omah Kayu + garasi + lantai loro

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());
                    

Omah Kayu

25000

Omah Kayu + Garasi

30000

Conto iki nggambarake keuntungan kanggo nganyarke obyek kanthi dekorator. Dadi kita ora nggantiomah kayuobyek dhewe, nanging nggawe obyek anyar adhedhasar lawas. Kene kita bisa ndeleng sing kaluwihan teka karo cacat: kita nggawe obyek anyar ing memori saben wektu, nambah konsumsi memori.

Deleng diagram UML program kita:

A decorator duwe implementasine super prasaja lan mbosenke ngganti obyek, nganyarke mau. Dekorator bisa dikenali dening konstruktor sing, kang njupuk minangka obyek paramèter saka jinis abstrak padha utawa antarmuka minangka kelas saiki. Ing Jawa, pola iki akeh digunakake ing kelas I/O.

Contone, kaya sing wis dingerteni, kabeh subkelas java.io.InputStream , OutputStream , Reader lan Writer duwe konstruktor sing nampa obyek saka kelas sing padha.