รูปแบบเทมเพลต:
วิธีการเทมเพลตเป็นเรื่องเกี่ยวกับการให้คลาสย่อยกำหนดขั้นตอนบางอย่างของอัลกอริทึมใหม่โดยไม่เปลี่ยนโครงสร้างหลักและขั้นตอนของอัลกอริทึมที่กำหนดไว้ในคลาสพื้นฐาน รูปแบบเทมเพลตมักจะใช้การสืบทอดดังนั้นการใช้อัลกอริทึมทั่วไปสามารถให้ไว้ในคลาสพื้นฐานซึ่งคลาสย่อยอาจเลือกที่จะแทนที่หากจำเป็น
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;
}
}
หมายเหตุในโค้ดด้านบนขั้นตอนวิธี go () จะเหมือนกันเสมอ แต่คลาสย่อยอาจกำหนดสูตรที่แตกต่างกันสำหรับการทำขั้นตอนที่เฉพาะเจาะจง
รูปแบบกลยุทธ์:
รูปแบบกลยุทธ์เป็นเรื่องเกี่ยวกับการให้ลูกค้าเลือกใช้อัลกอริธึมที่เป็นรูปธรรมที่รันไทม์ อัลกอริธึมทั้งหมดนั้นแยกและเป็นอิสระ แต่ใช้อินเตอร์เฟสทั่วไปและไม่มีแนวคิดในการกำหนดขั้นตอนเฉพาะภายในอัลกอริทึม
/**
* 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);
}
}
}
สำหรับรหัสที่มาเต็มตรวจสอบ GitHub ของฉันที่เก็บ