"Defer the exact steps of an algorithm to a subclass"
The Template Method defines a skeleton of an algorithm in an operation,
and defers some steps to subclasses. Home builders use the Template
Method when developing a new subdivision. A typical subdivision
consists of a limited number of floor plans with different variations
available for each. Within a floor plan, the foundation, framing,
plumbing, and wiring will be identical for each house. Variation is
introduced in the later stages of construction to produce a wider
variety of models.
Another example: daily routine of a worker.
Rules of thumb
- Strategy is like Template Method except in its granularity.
- Template Method uses inheritance to vary part of an algorithm. Strategy uses delegation to vary the entire algorithm.
- Strategy modifies the logic of individual objects. Template Method modifies the logic of an entire class.
- Factory Method is a specialization of Template Method.
Download full source code here
“Tin tốt”, giám đốc GigundoCorp – một công ty mới mà bạn đang nhận trách nhiệm tư vấn – vừa nói trong khi chạy vào phòng họp “Chúng ta đã nhận được hợp đồng đó”
“Hợp đồng nào?”, mọi người hỏi
“Hợp đồng về những con rô bốt tự động lắp ráp xe hơi”, vị giám đốc nói.
“Ồ, thì ra là hợp đồng đó” Mọi người nói.
“Giờ thì về phòng và viết chương trình thôi”, vị giám đốc vừa nói và xua đuổi mọi người ra khỏi phòng họp
“Chờ một lát”, bạn nói “Chúng ta có nên dành chút thời gian cho vấn
đề thiết kế không? Ví dụ: có khả năng chúng ta sẽ tạo một loại khác của
rô bốt trong tương lai chẳng hạn”
“Chắc chắn rồi”, vị giám đốc nói. “Chúng ta có một tá hồ sơ dự thầu
ngoài đó. Nhưng không có thời gian nghĩ về nó đâu. Chúng ta cần phải bắt
đầu tạo những con rô bốt tự động trước”
“Vâng”, các lập trình viên rên rỉ và mọi người trở về phòng của mình.
“Có điều gì đó mách bảo với tôi rằng họ đang mắc phải sai lầm”, bạn
tự nhủ trong căn phòng trống rỗng, rải rác những ly Styrofoam trống rỗng
lăn lóc khắp sàn.
Chương này nói này về hai mẫu thiết kế giúp bạn có một cách thức khéo
léo hơn trong việc tạo dựng các đối tượng: mẫu Template Method và mẫu Builder. Mẫu Template Method cho phép các lớp con định nghĩa lại các
bước tạo đối tượng, rất thích hợp cho việc tạo ra các chủng loại rô bốt
khác nhau. Mẫu Builder giúp bạn uyển chuyển hơn trong việc tạo đối tượng
vì nó tách rời quá trình khởi tạo ra khỏi bản thân đối tượng. Cả hai
mẫu sẽ được thảo luận trong chương này
Tạo robo đầu tiên
Các lập trình viên của GigundoCorp đã xào
nấu ra phần mềm của họ trong vài ngày và nó vừa đủ đơn giản. Lớp robot
bắt đầu với một hàm khởi tạo và có một số hành động mà robot có thể thực hiện, ví dụ như, để khởi
động robot, bạn gọi hàm bắt đầu Start, để robot làm việc, bạn gọi hàm
lắp ráp assemble, để kiểm tra sản phẩm, bạn gọi hàm kiểm tra test, ..
public class cRobo{
public cRobo()
{
}
public void go()
{
start();
getParts();
assemble();
test();
stop();
}
public void start()
{
Console.WriteLine("staring ...");
}
public void getParts()
{
Console.WriteLine("Getting a carburetor ...");
}
public void assemble()
{
Console.WriteLine("assembling ...");
}
public void test()
{
Console.WriteLine("Testing ...");
}
public void stop()
{
Console.WriteLine("Stopping ...");
}
}
Bạn có thể nhanh chóng viết chương trình kiểm tra. Đầu tiên tạo một robot và gọi hàm go như sau:
public static void main() {
cRobo robo = new cRobo();
robo.go();
}
khi chạy chương trình ...
Staring ....Getting a carburetor ...
assembling ...
Testing ...
Stopping ...
“Tuyệt vời”, giám đốc điều hành phấn khích. “Phần thưởng luôn ở xung quanh. Tôi đã nói với anh rằng họ không cần cái thứ mẫu thiết kế vớ vấn”. Các lập trình viên của công ty ném cho bạn một ánh nhìn dè bỉu.
Tạo Robot với Mẫu thiết kế Template Method
Ngày tiếp theo, “Tin tốt”, giám đốc điều hành của GigundoCorp la lớn, trong khi phóng vào phòng họp. “Chúng ta kí được hợp đồng khác!”
“Hợp đồng khác nào?” Mọi người hỏi
“Hợp đồng cho robot nướng bánh” Vị giám đốc nói “Giờ thì ra khỏi đây và viết phần mềm cho nó”
Các lập trình viên nhìn vào trong ly cà phê của họ “Chúng ta phải viết lại tất cả phần mềm từ đầu”, họ nói
Vị giám đốc liếc mắt nhìn bạn và hỏi “Có tốn nhiều chi phí không?”
“Rất nhiều”, các lập trình viên nói. Và bạn thì đang chống lại sự thúc giục để nói rằng “Tôi đã nói với các anh từ trước”
Đây là thời điểm thích hợp để nói về mẫu thiết kế Template Method. Có một rắc rối mà lập trình viên GigundoCopr đối mặt, họ có một con robot tự động như hình sau:
Nhưng bây giờ họ cần một con robot nướng bánh như hình sau, và thế là phải viết lại mã nguồn từ đầu
Con robot nướng bánh có một số chức năng giống như con robot lắp ráp ô tô, như là hàm start, stop, tuy nhiên nó có những sự khác biệt như lắp ráp getParts sẽ không hiển thị “Getting a carburetor” mà thay vào đó là “Getting flour and sugar…”
Đó là nơi mà mẫu thiết kế Template Method được áp dụng. Mẫu này nói
rằng, bạn có thể viết một phương thức, dùng để xác định một loạt các
thuật toán, giống như hàm go mà bạn thấy trước đây, để chạy một loạt các
chức năng cho robot như hình:
public void go()
{
start();
getParts();
assemble();
test();
stop();
}
Sau đó bạn đưa hàm này vào một bộ khuôn template bằng cách cho phép
các lớp con định nghĩa lại các bước thuật toán theo cách cần thiết.
Trong trường hợp này, để làm một con robot nướng bánh, bạn sẽ viết lại
các hàm getParts, assemble, và test.
Theo định nghĩa chính thức của sách GoF, mẫu Template Method như sau:
“Định nghĩa một bộ khung của một thuật toán trong một chức năng, chuyển
giao việc thực hiện nó cho các lớp con. Mẫu Template Method cho phép
lớp con định nghĩa lại cách thực hiện của một thuật toán, mà không phải
thay đổi cấu trúc thuật toán.”
Điều này có nghĩa là bạn nên sử dụng mẫu Template Method khi bạn có
một thuận toán được tạo bởi nhiều bước, và bạn muốn thể tùy chỉnh một số
bước trong đó. Chú ý rằng nếu bạn muốn viết lại mọi thứ từ đầu – khi
mọi bước đều phải tùy chỉnh lại – thì bạn không cần dùng template.
Tạo robot bằng bộ khuôn Template
Nếu bạn có một bộ khuôn Template dựa trên robot, bạn có thể cho nó kế thừa như hình sau:Bằng cách gọi hàm go, tập hợp các thuật toán sẽ được thực hiện. Để tùy chỉnh trong lớp kế thừa, bạn chỉ cần viết lại một số bước nào bạn muốn, trong trường hợp robot nướng bánh sẽ như hình sau:
Đó là ý tưởng đằng sau mẫu thiết kế Template Method – Một chức năng
bao gồm nhiều bước sẽ được tùy chỉnh bởi lớp con. Trong trường hợp bạn
cần hai robot, một robot lắp ráp ô tô, một robot nướng bánh, mọi việc sẽ
như thế nào?
Bạn bắt đầu bằng cách tạo một bộ khuôn Template trong một lớp trừu
tượng abstract (để lớp khác có thể kế thừa nó), gọi là RobotTemplate
Xem source code đính kèm nhen các bạn ^_^
Ref
https://haihth.wordpress.com/2013/02/23/dp-chapter7/
https://sourcemaking.com/design_patterns/template_method