Hatırlayıcı
Bir nesnenin durumunu saklayıp, daha sonra bu duruma tekrar geri dönebilmesini sağlayan tasarım desenidir. Örneğin bir kelime işlemcide en son yapılan işlem gerçekleşmeden önceki duruma dönmeyi sağlayan "geri dön" özelliğinde bu tasarım deseni kullanılabilir. Kısaca nesnenin bazı durumlarını saklamak ve bu durumlara geri dönüş yapabilmeyi sağlar.
Örnek :
Hatırlayıcı tasarım deseni örneğinin konusu döküman yazan bir programın "geri al" işlevi ile ilgilidir. Bu program döküman içeriklerini Döküman isimli bir sınıfta tutmaktadır. Döküman sınıfının içeriğini de, ileriki kullanımlar için saklayan DökümanHatırlayıcı sınıfıdır. Bu sınıf tasarım desenindeki hatırlayıcı sınıfımızdır. Döküman ve her bir döküman yazma haretekini tutan DökümanHatırlayıcı nesnelerinin listesini tutan DökümanYazımProgramı sınıfıdır. Bı sınıfa her bir yeni döküman içeriği geldiğinde, bu içeriğe bağlı bir tane hatırlayıcı nesne yaratılır ve bu nesne de, hatırlayıcı nesnelerin listesine eklenir. Bu sınıftaki geriAl yordamı ise, listedeki en son döküman içeriğini tutan hatırlayıcı nesneyi çeker ve döküman içeriğini bu hatırlayıcı nesnenin içindeki içerik olarak ayarlar. Sistemi kullanan Kullanıcı sınıfını incelersek, sırayla "1", "2", "3", "4" içerikleri gelmiştir. Sonra da üç kere geri al işlevi çalıştırılmıştır. Bu işlemden sonra döküman içeriğinin üç işlem gerideki "1" olduğu görülmüştür.
Örnek Sınıf Çizelgesi :
Örnek Java Kodu : ( Kodlar java 1.6.0.7 ile derlenip, çalıştırılmıştır. )
Döküman.java :
public class Döküman {
private String içerik;
public String içerikAl() {
return içerik;
}
public void içerikAta( String içerik ) {
this.içerik = içerik;
}
public DökümanHatırlayıcı hatırlayıcıYarat() {
return new DökümanHatırlayıcı( this );
}
public void hatırlayıcıAta( DökümanHatırlayıcı hatırlayıcı ) {
this.içerik = hatırlayıcı.içerikAl();
}
}
DökümanHatırlayıcı.java :
public class DökümanHatırlayıcı {
private String içerik;
public DökümanHatırlayıcı( Döküman döküman ) {
this.içerik = döküman.içerikAl();
}
public String içerikAl() {
return içerik;
}
}
DökümanYazımProgramı.java :
import java.util.ArrayList;
import java.util.List;
public class DökümanYazımProgramı {
private Döküman döküman;
private List< DökümanHatırlayıcı > geçmişListesi
= new ArrayList< DökümanHatırlayıcı >();
public DökümanYazımProgramı( Döküman döküman ) {
this.döküman = döküman;
}
public void dökümanYaz( String yeniİçerik ) {
DökümanHatırlayıcı hatırlayıcı = döküman.hatırlayıcıYarat();
geçmişListesi.add( hatırlayıcı );
döküman.içerikAta( yeniİçerik );
}
public void geriAl() {
DökümanHatırlayıcı hatırlayıcı =
geçmişListesi.remove( geçmişListesi.size() - 1 );
döküman.hatırlayıcıAta( hatırlayıcı );
}
}
Kullanıcı.java :
public class Kullanıcı {
public static void main(String[] args) {
Döküman döküman = new Döküman();
döküman.içerikAta( "" );
DökümanYazımProgramı program =
new DökümanYazımProgramı( döküman );
program.dökümanYaz( "1" );
program.dökümanYaz( "2" );
program.dökümanYaz( "3" );
program.dökümanYaz( "4" );
// En son içerik "4" yazılır.
// Fakat önceki içerikler saklanır.
System.out.println( döküman.içerikAl() );
// Son üç işlem geri alınır.
program.geriAl();
program.geriAl();
program.geriAl();
// Son üç işlem geri alındığı için, "1" içeriği yazılır.
System.out.println( döküman.içerikAl() );
}
}