Pola Templat:
Metode template adalah tentang membiarkan subclass mendefinisikan kembali langkah-langkah tertentu dari algoritma, tanpa mengubah struktur utama dan langkah-langkah algoritma, yang didefinisikan dalam kelas dasar. Pola templat biasanya menggunakan pewarisan, sehingga implementasi umum dari algoritma dapat disediakan di kelas dasar, yang dapat ditimpa oleh subkelas jika perlu.
public abstract class RobotTemplate {
/* This method can be overridden by a subclass if required */
public void start() {
System.out.println("Starting....");
}
/* This method can be overridden by a subclass if required */
public void getParts() {
System.out.println("Getting parts....");
}
/* This method can be overridden by a subclass if required */
public void assemble() {
System.out.println("Assembling....");
}
/* This method can be overridden by a subclass if required */
public void test() {
System.out.println("Testing....");
}
/* This method can be overridden by a subclass if required */
public void stop() {
System.out.println("Stopping....");
}
/*
* Template algorithm method made up of multiple steps, whose structure and
* order of steps will not be changed by subclasses.
*/
public final void go() {
start();
getParts();
assemble();
test();
stop();
}
}
/* Concrete subclass overrides template step methods as required for its use */
public class CookieRobot extends RobotTemplate {
private String name;
public CookieRobot(String n) {
name = n;
}
@Override
public void getParts() {
System.out.println("Getting a flour and sugar....");
}
@Override
public void assemble() {
System.out.println("Baking a cookie....");
}
@Override
public void test() {
System.out.println("Crunching a cookie....");
}
public String getName() {
return name;
}
}
Catatan dalam kode di atas, langkah-langkah algoritma go () akan selalu sama, tetapi subclass mungkin mendefinisikan resep berbeda untuk melakukan langkah tertentu.
Pola Strategi:
Pola strategi adalah tentang membiarkan klien memilih implementasi algoritma konkret saat runtime. Semua algoritma terisolasi dan independen, tetapi menerapkan antarmuka umum, dan tidak ada gagasan untuk menentukan langkah-langkah tertentu dalam algoritma.
/**
* This Strategy interface is implemented by all concrete objects representing an
* algorithm(strategy), which lets us define a family of algorithms.
*/
public interface Logging {
void write(String message);
}
/**
* Concrete strategy class representing a particular algorithm.
*/
public class ConsoleLogging implements Logging {
@Override
public void write(String message) {
System.out.println(message);
}
}
/**
* Concrete strategy class representing a particular algorithm.
*/
public class FileLogging implements Logging {
private final File toWrite;
public FileLogging(final File toWrite) {
this.toWrite = toWrite;
}
@Override
public void write(String message) {
try {
final FileWriter fos = new FileWriter(toWrite);
fos.write(message);
fos.close();
} catch (IOException e) {
System.out.println(e);
}
}
}
Untuk kode sumber lengkap, lihat repositori github saya .