Merhabalar Java dostları,
Yeni bir tasarım şablonu ile beraberiz. Decorator design pattern, mevcut bir sınıf yapısını değiştirmeden yeni özelliklere sahip nesneler oluşturmayı amaçlar. Bu şablon ile oluşan yeni nesnenin, decorator nesne ile olan interfaceleri aynıdır; fakat arka planda ek işlemler yapabilmektedir. Yani mevcut nesne, yeni nesne içerisinde gömülü halde bulunur. Peki bu yöntemi kalıtım ile yapamaz mıyız sorusu akla geliyor. Elbette yapabiliriz; fakat daha sonra bakım ve güncelleme maliyetleri yüksek olacaktır. Çünkü kalıtım işleminde daha sıkı bir bağ vardır.
İsterseniz örneğimize geçelim.
package designpattern.decorator;public interface IRoom{public void prepareRoom();} |
package designpattern.decorator;public class HotelRoom implements IRoom { @Override public void prepareRoom() { System.out.println(“Hotel room prepared…”); } } |
package designpattern.decorator;public abstract class HotelRoomDecorator implements IRoom { private IRoom hotelRoom = null; public HotelRoomDecorator(IRoom room) { this.hotelRoom = room; } public IRoom getHotelRoom() { return hotelRoom; } } |
package designpattern.decorator;public class DoubleHotelRoom extends HotelRoomDecorator { public DoubleHotelRoom(IRoom room) { super(room); } @Override public void prepareRoom() { prepareDoubleBed(); getHotelRoom().prepareRoom(); } public void prepareDoubleBed() { System.out.println(“Double bed room prepared…”); } } |
package designpattern.decorator;public class DecoratorMain { public static void main(String[] args) { IRoom classicRoom = new HotelRoom(); IRoom doubleRoom = new DoubleHotelRoom(classicRoom); classicRoom.prepareRoom(); doubleRoom.prepareRoom(); } } |
Öncelikle her zamanki gibi bir interface tanımlıyoruz ve bunu implemente eden klasik bir otel odası oluşturuyoruz; fakat daha sonra bizim çift kişilik bir odaya ihtiyacımızın olduğunu görüyoruz ve bunun için bir tane decorator tanımlıyoruz. Bu decorator HotelRoomDecorator sınıfı içerisinde var olan nesneyi tutarak üzerine eklemeler yapmaya çalışacaktır. Daha sonra decorator sınıftan extends olan sınıf tanımlıyoruz. Bu sınıf var olan özellik ve fonksiyonlara ek olarak kendisi de bazı işlemler yapmaktadır. Sonuç olarak ilk sınıfın özelliklerini bozmadan çift kişilik bir oda tanımladık. İleride kral dairesi eklemek istediğimizde tek yapmamız gereken oluşacak yeni sınıfı tıpkı DoubleHotelRoom sınıfında olduğu gibi, HotelRoomDecorator sınıfından extends etmektir.
Bol Java’ lı günler dileğiyle…
Yazan: Faruk BOZAN