Sự khác biệt giữa phương pháp mẫu và các mẫu chiến lược là gì?


161

Ai đó có thể vui lòng giải thích cho tôi sự khác biệt giữa mẫu phương thức mẫu và mẫu chiến lược là gì không?

Theo như tôi có thể nói chúng giống nhau đến 99% - điểm khác biệt duy nhất là mẫu phương thức mẫu có một lớp trừu tượng là lớp cơ sở trong khi lớp chiến lược sử dụng một giao diện được thực hiện bởi mỗi lớp chiến lược cụ thể.

Tuy nhiên, theo như khách hàng quan tâm, họ được tiêu thụ theo cách chính xác như vậy - điều này có đúng không?


2
Bài đăng này trong SO có câu trả lời tốt hơn cho cùng một câu hỏi: stackoverflow.com/questions/464524/iêu
Gob00st

12
Câu hỏi gob00st liên kết đến là sự khác biệt giữa chiến lược và cầu nối. Nó không phải là câu trả lời cho câu hỏi này cả.
bluekey 30/1/2015

Câu trả lời:


135

Sự khác biệt chính giữa hai là khi thuật toán cụ thể được chọn.

Với mẫu phương thức Mẫu, điều này xảy ra tại thời gian biên dịch bằng cách phân lớp mẫu. Mỗi lớp con cung cấp một thuật toán cụ thể khác nhau bằng cách thực hiện các phương thức trừu tượng của mẫu. Khi khách hàng gọi các phương thức của giao diện bên ngoài của mẫu, mẫu sẽ gọi các phương thức trừu tượng của nó (giao diện bên trong của nó) theo yêu cầu để gọi thuật toán.

class ConcreteAlgorithm : AbstractTemplate
{
    void DoAlgorithm(int datum) {...}
}

class AbstractTemplate
{
    void run(int datum) { DoAlgorithm(datum); }

    virtual void DoAlgorithm() = 0; // abstract
}

Ngược lại, mẫu Chiến lược cho phép chọn thuật toán trong thời gian chạy bằng cách ngăn chặn . Các thuật toán cụ thể được thực hiện bởi các lớp hoặc hàm riêng biệt được truyền cho chiến lược dưới dạng tham số cho hàm tạo của nó hoặc cho một phương thức setter. Thuật toán nào được chọn cho tham số này có thể thay đổi linh hoạt dựa trên trạng thái hoặc đầu vào của chương trình.

class ConcreteAlgorithm : IAlgorithm
{
    void DoAlgorithm(int datum) {...}
}

class Strategy
{
    Strategy(IAlgorithm algo) {...}

    void run(int datum) { this->algo.DoAlgorithm(datum); }
}

Tóm tắt:

  • Mẫu phương thức mẫu: lựa chọn thuật toán biên dịch thời gian bằng cách phân lớp
  • Mẫu chiến lược: lựa chọn thuật toán thời gian chạy bằng cách ngăn chặn

47
Cả hai mẫu đều hỗ trợ lựa chọn thời gian chạy của thuật toán được sử dụng (đối với Phương thức mẫu, bạn sẽ làm một cái gì đó giống như if (config.useAlgoA) impl = new AlgoA() else impl = new AlgoB()vậy) vì vậy câu trả lời này không chính xác.
Borek Bernard

13
Chắc chắn bạn có thể làm điều đó nhưng sau đó bạn không sử dụng Mẫu Mẫu. Trên thực tế, đó gần như chính xác là mã tạo ra thể hiện Chiến lược sẽ như thế nào!
nhà

21
-1, tôi nghĩ câu trả lời này (mặc dù không hoàn toàn sai), bỏ lỡ điểm khác biệt thực sự. Câu trả lời của @ tvanfosson tốt hơn nhiều.
Doc Brown

1
@Karoly Nyisztor Cả hai đều có thể "thay thế hành vi" và "cung cấp điểm mở rộng." Cho dù đó là một hành vi hay một phần mở rộng, nó thực sự tùy thuộc vào bối cảnh bạn áp dụng một mẫu nhất định. Bạn cũng có thể gọi mỗi lớp con của mẫu phương thức mẫu là "chiến lược" hoặc gọi mỗi lớp chiến lược trong mẫu chiến lược là "phần mở rộng", đó chỉ là cách diễn đạt. Thực tế của vấn đề là họ làm điều tương tự NGOẠI TRỪ sự khác biệt mà câu trả lời này đề cập. Vì vậy, đây là câu trả lời đúng.
Andy

1
Một thuật toán cụ thể được chọn theo cùng một cách cho cả hai mẫu. Sự lựa chọn được thực hiện bằng cách gọi new ConcreteAlgorithm1()so với new ConcreteAlgorithm2(). Rõ ràng sự lựa chọn xảy ra trong thời gian chạy (thực hiện một lựa chọn thuật toán tại thời gian biên dịch có nghĩa là mã hóa nó cứng). Sự khác biệt chính giữa hai là cách thuật toán cụ thể được thực hiện. Nó được thực hiện như là một lớp con hoặc như một giao diện riêng biệt? Các cựu là một mẫu. Sau này là một chiến lược. Sự khác biệt có thể được tóm tắt là thành phần so với thừa kế, đây là một chủ đề phổ biến của sách GoF.
jaco0646

138

Mẫu khuôn mẫu được sử dụng khi một hoạt động cụ thể có một số (các) hành vi bất biến có thể được xác định theo các hành vi nguyên thủy khác nhau khác. Lớp trừu tượng định nghĩa (các) hành vi bất biến, trong khi các lớp thực hiện định nghĩa các phương thức phụ thuộc.

Trong một chiến lược, việc triển khai hành vi là độc lập - mỗi lớp thực hiện xác định hành vi và không có mã được chia sẻ giữa chúng. Cả hai đều là mô hình hành vi và, như vậy, được khách hàng sử dụng theo nhiều cách giống nhau. Thông thường các chiến lược có một phương thức chung duy nhất - execute()phương thức, trong khi các mẫu có thể xác định một tập hợp các phương thức công khai cũng như một tập hợp các nguyên hàm riêng hỗ trợ mà các lớp con phải thực hiện.

Hai mẫu có thể dễ dàng được sử dụng cùng nhau. Bạn có thể có một mẫu chiến lược trong đó một số triển khai thuộc về một nhóm các chiến lược được triển khai bằng cách sử dụng một mẫu mẫu.


Điều này nghe có vẻ đúng với tôi, tuy nhiên tại sao WikiPedia lại đề cập rằng "mẫu chiến lược dành cho hành vi của thuật toán được chọn trong thời gian chạy"? Nó cũng có thể được sử dụng để chọn hành vi của thuật toán tại thời gian biên dịch, giống như phương thức mẫu? Tui bỏ lỡ điều gì vậy?
Sinh ra ToCode

2
@BornToCode Tôi sẽ giả sử những gì họ đang nói là chọn một chiến lược cụ thể trong thời gian chạy. Ví dụ, có một số cách tìm số gốc của phương trình. Tùy thuộc vào miền vấn đề hoặc dữ liệu bạn có thể chọn Newton-Raphson, Euler hoặc một số chiến lược khác để giải phương trình. Mỗi một trong số đó là một chiến lược. Thuật toán lớn hơn, trong đó giải phương trình là một phần, chọn chiến lược để sử dụng dựa trên một số chất lượng của vấn đề.
tvanfosson

Có, nhưng nó không giống như mô hình chiến lược chỉ nên được sử dụng cho những trường hợp đó? Ý tôi là nếu tôi chỉ cần chọn hành vi của thuật toán vào thời gian biên dịch thì tôi vẫn nên sử dụng mẫu chiến lược, hay nó không được sử dụng theo cách đó?
Sinh ra ToCode

1
@BornToCode Tôi sẽ nói rằng một chiến lược là hữu ích nhất khi sự lựa chọn là năng động. Mẫu về cơ bản là một cách xây dựng các hành vi khác nhau, có liên quan để biết. Bạn sẽ sử dụng một số chiến lược (mặc dù không nhất thiết phải là mẫu chiến lược) để chọn hành vi tạo khuôn mẫu nào sẽ sử dụng. Ví dụ: kế thừa sản phẩm - bạn sẽ tạo một sản phẩm cơ bản, thêm các tính năng cho các sản phẩm khác nhau. Việc chọn loại sản phẩm (lớp) nào để khởi tạo có thể phụ thuộc vào bảng / lượt xem mà nó được tải từ đó. Mô hình chiến lược không thực sự đi vào chơi ở đó.
tvanfosson

2
@BornToCode nó không phải là một hoặc một thứ, nó có - và. Áp dụng mẫu phù hợp, kết hợp các mẫu có ích.
tvanfosson


24

Bạn có thể có nghĩa là mẫu phương thức mẫu. Bạn nói đúng, họ phục vụ những nhu cầu rất giống nhau. Tôi sẽ nói rằng tốt hơn là sử dụng phương thức mẫu trong các trường hợp khi bạn có thuật toán "mẫu" có các bước được xác định trong đó các lớp con ghi đè các bước này để thay đổi một số chi tiết. Trong trường hợp chiến lược, bạn cần tạo một giao diện và thay vì kế thừa bạn đang sử dụng ủy quyền. Tôi có thể nói nó là một mô hình mạnh hơn một chút và có thể tốt hơn theo các nguyên tắc đảo ngược phụ thuộc vào DIP. Nó mạnh hơn bởi vì bạn xác định rõ ràng một sự trừu tượng hóa chiến lược mới - một cách làm một cái gì đó, không áp dụng cho phương thức mẫu. Vì vậy, nếu sự trừu tượng này có ý nghĩa - sử dụng nó. Tuy nhiên, sử dụng phương pháp mẫu có thể cung cấp cho bạn các thiết kế đơn giản hơn trong các trường hợp đơn giản, điều này cũng quan trọng. Xem xét những từ phù hợp hơn: Bạn có một thuật toán mẫu? Hoặc điều quan trọng ở đây là bạn có một sự trừu tượng về chiến lược - cách thức mới để làm một cái gì đó

Ví dụ về một phương thức mẫu:

Application.main()
{
Init();
Run();
Done();
}

Ở đây bạn kế thừa từ ứng dụng và thay thế chính xác những gì sẽ được thực hiện trên init, chạy và thực hiện.

Ví dụ về một chiến lược:

array.sort (IComparer<T> comparer)

Ở đây, khi viết một so sánh, bạn không kế thừa từ một mảng. Mảng ủy nhiệm thuật toán so sánh cho một bộ so sánh.


3
Tôi nghĩ rằng đây là một câu trả lời tuyệt vời
Calanus

23

Sự khác biệt giữa Chiến lược và Phương thức mẫu Chiến lược mẫu so với phương pháp Mẫu


Điểm tương đồng

Các mẫu phương thức Chiến lược và Mẫu có rất nhiều điểm tương đồng giữa chúng. Cả hai mẫu phương thức Chiến lược và Mẫu đều có thể được sử dụng để đáp ứng Nguyên tắc Đóng mở và làm cho mô-đun phần mềm dễ dàng mở rộng mà không cần thay đổi mã. Cả hai mẫu đại diện cho sự tách biệt chức năng chung với việc thực hiện chi tiết chức năng đó. Tuy nhiên, chúng khác nhau một chút về độ chi tiết mà chúng cung cấp.


Sự khác biệt

Dưới đây là một số khác biệt tôi đã quan sát thấy khi nghiên cứu hai mẫu này:

  1. Trong Chiến lược, sự kết hợp giữa máy khách và chiến lược lỏng lẻo hơn trong khi trong Phương thức mẫu, hai mô-đun được liên kết chặt chẽ hơn.
  2. Trong Chiến lược, phần lớn giao diện được sử dụng mặc dù lớp trừu tượng cũng có thể được sử dụng tùy theo tình huống và lớp cụ thể không được sử dụng trong khi trong phương thức Mẫu chủ yếu là lớp trừu tượng hoặc lớp cụ thể được sử dụng, giao diện không được sử dụng.
  3. Trong mẫu Chiến lược, nói chung, toàn bộ hành vi của lớp được thể hiện dưới dạng giao diện, mặt khác, phương thức Mẫu được sử dụng để giảm trùng lặp mã và mã soạn sẵn được xác định trong khung cơ sở hoặc lớp trừu tượng. Trong Phương thức mẫu, thậm chí có thể có một lớp cụ thể với triển khai mặc định.
  4. Nói một cách đơn giản, bạn có thể thay đổi toàn bộ chiến lược (thuật toán) trong mẫu Chiến lược, tuy nhiên, trong phương thức Mẫu, chỉ một số thứ thay đổi (các phần của thuật toán) và phần còn lại của mọi thứ vẫn không thay đổi. Trong Phương thức mẫu, các bước bất biến được triển khai trong một lớp cơ sở trừu tượng, trong khi các bước biến thể được cung cấp một triển khai mặc định hoặc hoàn toàn không thực hiện. Trong phương thức Mẫu, trình thiết kế thành phần bắt buộc các bước cần thiết của thuật toán và sắp xếp các bước, nhưng cho phép máy khách thành phần mở rộng hoặc thay thế một số bước của các bước này.

Hình ảnh được lấy từ blog cắn .


19

Kế thừa so với tập hợp (is-a so với has-a). Đó là hai cách để đạt được cùng một mục tiêu.

Câu hỏi này cho thấy một số sự đánh đổi giữa các lựa chọn: Kế thừa so với Tập hợp


11

Cả hai đều rất giống nhau và cả hai đều được sử dụng bởi mã máy khách theo những cách tương tự nhau. Không giống như những gì câu trả lời phổ biến nhất ở trên nói, cả hai đều cho phép lựa chọn thuật toán vào thời gian chạy .

Sự khác biệt giữa hai là trong khi mẫu chiến lược cho phép các cách triển khai khác nhau sử dụng các cách hoàn toàn khác nhau để đạt được kết quả mong muốn, mẫu phương thức mẫu chỉ định thuật toán bao quát (phương thức "mẫu") được sử dụng để đạt được kết quả - - sự lựa chọn duy nhất còn lại cho các triển khai cụ thể (các lớp con) là các chi tiết nhất định của phương thức mẫu đã nói. Điều này được thực hiện bằng cách có phương thức khuôn mẫu thực hiện cuộc gọi đến một hoặc nhiều phương thức trừu tượng được ghi đè (nghĩa là được triển khai) bởi các lớp con, không giống như phương thức khuôn mẫu mà bản thân nó không trừu tượng và không bị ghi đè bởi các lớp con .

Mã máy khách thực hiện cuộc gọi đến phương thức mẫu bằng cách sử dụng một tham chiếu / con trỏ của loại lớp trừu tượng trỏ đến một thể hiện của một trong các lớp con cụ thể có thể được xác định trong thời gian chạy giống như khi sử dụng Mẫu chiến lược.


9

Phương pháp mẫu:

  1. Nó dựa trên sự kế thừa
  2. Xác định bộ xương của thuật toán không thể thay đổi bởi các lớp con. Chỉ các hoạt động nhất định có thể được ghi đè trong các lớp con
  3. Lớp cha hoàn toàn kiểm soát thuật toán và chỉ khác nhau một số bước nhất định đối với các lớp cụ thể
  4. Binding được thực hiện tại thời gian biên dịch

Cấu trúc Template_method :

nhập mô tả hình ảnh ở đây

Chiến lược:

  1. Nó dựa trên sự ủy thác / sáng tác
  2. Nó thay đổi can đảm của đối tượng bằng cách sửa đổi hành vi phương thức
  3. Nó được sử dụng để chuyển đổi giữa các thuật toán
  4. Nó thay đổi hành vi của đối tượng trong thời gian chạy bằng cách thay thế hoàn toàn một thuật toán bằng thuật toán khác trong thời gian chạy
  5. Binding được thực hiện trong thời gian chạy

cấu chiến lược :

nhập mô tả hình ảnh ở đây

Có một cái nhìn về phương pháp Mẫu và bài viết Chiến lược để hiểu rõ hơn.

Bài viết liên quan:

Mẫu thiết kế mẫu trong JDK, không thể tìm thấy một phương thức xác định tập hợp các phương thức sẽ được thực hiện theo thứ tự

Ví dụ thực tế về mô hình chiến lược


3

Không, chúng không nhất thiết phải được tiêu thụ theo cùng một cách. Mẫu "phương thức mẫu" là một cách cung cấp "hướng dẫn" cho những người triển khai trong tương lai. Bạn đang nói với họ, "Tất cả các đối tượng Cá nhân phải có Số An sinh Xã hội" (đó là một ví dụ tầm thường nhưng nó hiểu ý chính xác).

Mẫu chiến lược cho phép nhiều triển khai có thể được chuyển đổi vào và ra. Nó không (thường) được thực hiện thông qua thừa kế, mà thay vào đó bằng cách cho phép người gọi vượt qua trong việc thực hiện mong muốn. Một ví dụ có thể cho phép ShippingCalculator được cung cấp một trong nhiều cách tính thuế khác nhau (triển khai NoSalesTax và triển khai PercentageBasingSalesTax).

Vì vậy, đôi khi, khách hàng thực sự sẽ cho đối tượng biết nên sử dụng chiến lược nào. Như trong

myShippingCalculator.CalculateTaxes(myCaliforniaSalesTaxImpl);

Nhưng khách hàng sẽ không bao giờ làm điều đó cho một đối tượng dựa trên Phương thức mẫu. Trong thực tế, khách hàng thậm chí có thể không biết một đối tượng dựa trên Phương thức mẫu. Các phương thức trừu tượng đó trong mẫu Phương thức mẫu thậm chí có thể được bảo vệ, trong trường hợp đó, khách hàng thậm chí sẽ không biết chúng tồn tại.


3

Tôi sẽ đề nghị bạn đọc này bài viết. Nó giải thích sự khác biệt trên một ví dụ trường hợp thực tế.

Trích dẫn từ bài báo

" Như mọi người có thể thấy các lớp triển khai cũng phụ thuộc vào lớp phương thức mẫu. Sự phụ thuộc này gây ra thay đổi phương thức mẫu nếu người ta muốn thay đổi một số bước của thuật toán. Mặt khác, chiến lược đóng gói hoàn toàn thuật toán. Các lớp để xác định hoàn toàn một thuật toán. Do đó, nếu có bất kỳ thay đổi nào xảy ra, bạn cần thay đổi mã cho các lớp được viết trước đó. Đây là lý do chính khiến tôi chọn chiến lược để thiết kế các lớp.

Một tính năng của phương thức mẫu là phương thức mẫu điều khiển thuật toán. Đó có thể là một điều tốt trong tình huống khác nhưng trong vấn đề của tôi, điều này đã hạn chế tôi thiết kế các lớp. Mặt khác, chiến lược không kiểm soát các bước của thuật toán cho phép tôi thêm các phương thức chuyển đổi hoàn toàn khác nhau. Do đó trong trường hợp chiến lược của tôi giúp tôi thực hiện.

Một nhược điểm của chiến lược là có quá nhiều dự phòng mã và chia sẻ mã ít hơn. Vì rõ ràng trong ví dụ được trình bày của bài viết này, tôi phải lặp lại cùng một mã trong bốn lớp. Do đó, rất khó để duy trì vì nếu việc triển khai hệ thống của chúng tôi như bước 4 chung cho tất cả bị thay đổi thì tôi sẽ phải cập nhật điều này trong cả 5 lớp. Mặt khác, trong phương thức mẫu, tôi chỉ có thể thay đổi siêu lớp và các thay đổi được phản ánh vào các lớp con. Do đó, phương thức khuôn mẫu cung cấp một lượng dự phòng rất thấp và lượng chia sẻ mã cao giữa các lớp.

Chiến lược cũng cho phép thay đổi thuật toán trong thời gian chạy. Trong phương thức mẫu, người ta sẽ phải khởi tạo lại đối tượng. Tính năng này của chiến lược cung cấp số lượng lớn tính linh hoạt. Từ quan điểm thiết kế, người ta phải thích sáng tác hơn kế thừa. Do đó, sử dụng mô hình chiến lược cũng trở thành lựa chọn chính cho sự phát triển. "


2

Mẫu Mẫu tương tự như mẫu Chiến lược. Hai mẫu này khác nhau về phạm vi và phương pháp luận.

Chiến lược được sử dụng để cho phép người gọi thay đổi toàn bộ thuật toán, như cách tính các loại thuế khác nhau, trong khi Phương thức mẫu được sử dụng để thay đổi các bước trong thuật toán. Bởi vì điều này, Chiến lược là chi tiết thô hơn. Mẫu cho phép các điều khiển chi tiết hơn trong chuỗi hoạt động và vẫn cho phép việc triển khai các chi tiết này thay đổi.

Sự khác biệt chính khác là Chiến lược sử dụng ủy quyền trong khi Phương thức mẫu sử dụng tính kế thừa. Trong Chiến lược, thuật toán được ủy quyền cho một lớp xxxStrargety khác mà chủ đề sẽ có một tham chiếu đến, nhưng với Mẫu bạn phân lớp các phương thức cơ sở và ghi đè để thực hiện các thay đổi.

từ http://cyruscrypt.blogspot.com/2005/07/template-vs-strargety-potypes.html


2

Trong các lớp con mô hình chiến lược đang chạy chương trình và họ điều khiển thuật toán. Ở đây mã được sao chép trên các lớp con. Kiến thức về thuật toán và cách thực hiện nó được phân phối trên nhiều lớp.

Trong mẫu mẫu, lớp cơ sở có thuật toán. Nó tối đa hóa việc tái sử dụng giữa các lớp con. Vì thuật toán nằm ở một nơi, lớp cơ sở bảo vệ nó.


2

Mẫu thiết kế chiến lược

  • Hỗ trợ sáng tác.
  • Cung cấp cho bạn sự linh hoạt để thay đổi hành vi của đối tượng khi chạy.
  • Ít khớp nối giữa mã máy khách và mã giải pháp / thuật toán.

Mẫu Phương pháp Thiết kế Mẫu

  • Ưu tiên thừa kế trên thành phần
  • Xác định thuật toán trong lớp cơ sở của bạn. Các phần của thuật toán có thể được tùy chỉnh trong các lớp con.

1

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 .


0

Chiến lược được đưa ra như một phương thức Giao diện và mẫu như là Lớp trừu tượng. Điều này thường được sử dụng rất nhiều trong các khung. ví dụ: lớp MessageSource của Spring framework là giao diện chiến lược để giải quyết các thông báo. Khách hàng sử dụng triển khai cụ thể (chiến lược) của giao diện này.

Và việc triển khai trừu tượng của cùng một giao diện AbstractMessageSource, có triển khai chung để giải quyết các thông báo và hiển thị phương thức trừu tượng notifyCode () để các lớp con có thể thực hiện chúng theo cách của chúng. AbstractMessageSource là một ví dụ về phương thức mẫu.

http://docs.spring.io/spring/docs/4.1.7.RELEASE/javadoc-api/org/springframework/context/support/AbaugeMessageSource.html


0

Trong phương thức mẫu của mẫu thiết kế này, một hoặc nhiều bước thuật toán có thể được ghi đè bởi các lớp con để cho phép các hành vi khác nhau trong khi đảm bảo rằng thuật toán bao trùm vẫn được tuân theo (Wiki).

Tên mẫu Phương thức mẫu có nghĩa là gì. Giả sử chúng ta có một phương thức Tính toán () và chúng ta muốn tạo mẫu cho phương thức này. Phương thức này sẽ được khai báo trong lớp cơ sở một phương thức không ảo. Nói phương pháp này trông như thế này.

CalculateSomething(){
    int i = 0;
    i = Step1(i);
    i++;
    if (i> 10) i = 5;
    i = Step2(i);
    return i;

} Việc thực hiện phương thức Step1 và Step2 có thể được đưa ra bởi các lớp dẫn xuất.

Trong Mẫu chiến lược không có triển khai được cung cấp bởi cơ sở (Đây là lý do tại sao cơ sở thực sự là một giao diện trong sơ đồ lớp)

Ví dụ cổ điển là sắp xếp. Dựa trên số lượng đối tượng cần được sắp xếp, lớp thuật toán thích hợp (hợp nhất, bong bóng, nhanh, v.v.) được tạo ra và toàn bộ thuật toán được gói gọn trong mỗi lớp.

Bây giờ chúng ta có thể thực hiện sắp xếp như một phương thức mẫu không? Chắc chắn bạn có thể, nhưng bạn sẽ không tìm thấy nhiều / bất kỳ điểm chung nào được trừu tượng hóa và được đặt trong triển khai cơ sở. Vì vậy, nó đánh bại mục đích của mẫu phương thức mẫu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.