Mẫu mẫu:
Phương thức mẫu là về việc cho phép các lớp con xác định lại các bước nhất định của thuật toán, mà không thay đổi cấu trúc chính và các bước của thuật toán, được xác định trong lớp cơ sở. Mẫu khuôn mẫu thường sử dụng tính kế thừa, do đó, việc triển khai chung các thuật toán có thể được cung cấp trong lớp cơ sở, mà lớp con có thể chọn ghi đè nếu cần.
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;
}
}
Lưu ý trong đoạn mã trên, các bước thuật toán go () sẽ luôn giống nhau, nhưng các lớp con có thể xác định một công thức khác để thực hiện một bước cụ thể.
Mô hình chiến lược:
Mẫu chiến lược là về việc cho phép khách hàng chọn triển khai thuật toán cụ thể trong thời gian chạy. Tất cả các thuật toán được tách biệt và độc lập, nhưng thực hiện một giao diện chung và không có khái niệm xác định các bước cụ thể trong thuật toán.
/**
* 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);
}
}
}
Để biết mã nguồn đầy đủ, hãy xem kho lưu trữ github của tôi .