5

đây có phải là ví dụ về Mẫu PatternMethod không ??Điểm tương đồng giữa các mẫu thiết kế Phương pháp mẫu và Chiến lược là gì

public abstract class Character{ 

    public final void useWeapon(){ 
     useBusterSword(); 
     useMateriaBlade(); 
     useUltimateWeapon(); 
    } 

    public abstract void useBusterSword(); 
    public abstract void useMateriaBlade(); 
    public abstract void useUltimateWeapon(); 
} 

public class Cloud extends Character{ 

    public void useUltimateWeapon() { 
     System.out.println("Change Weapon to Ultima Weapon"); 
    } 


    public void useBusterSword() { 

    } 


    public void useMateriaBlade() { 

    } 
} 


public class TestGame { 
    public static void main(String[] args){ 
     Character cloud = new Cloud(); 
     cloud.useWeapon(); 
    } 
} 

Nếu vậy thì lợi thế của việc sử dụng mẫu này so với mẫu chiến lược là gì?

Chiến lược Pattern

public class Character { 
    WeaponBehavior w; 
    public void setWeaponBehavior(WeaponBehavior wb){ 
     w = wb; 
    } 

    public void useWeapon(){ 
     w.useWeapon(); 
    } 
} 

public class Cloud extends Character{ 

    public Cloud(){ 
     w = new UltimaWeapon(); 
    } 

} 


public interface WeaponBehavior { 
    public void useWeapon(); 
} 

public class UltimaWeapon implements WeaponBehavior { 
    public void useWeapon() { 
     System.out.println("Change Weapon to UltimaWeapon"); 
    } 

} 

public class BusterSword implements WeaponBehavior { 
    public void useWeapon() { 
     System.out.println("Change Weapon to MateriaBlade"); 
    } 

} 

public class MateriaBlade implements WeaponBehavior { 
    public void useWeapon() { 
     System.out.println("Change Weapon to MateriaBlade"); 
    } 

} 

public class TestGame { 
    public static void main(String[] args){ 
     Character c = new Cloud(); 
     c.useWeapon(); 
    } 
} 

Những gì tôi nhận thấy là chiến lược mô hình đóng gói những gì thay đổi không giống như TemplateMethod Pattern cho phép người subclassed xử lý gì khác nhau.

Trả lời

1

Mẫu phương thức mẫu hữu ích khi bạn muốn sử dụng một số trường của lớp cha và khi triển khai thực sự không phải là toàn bộ thuật toán nhưng chỉ một số 'logic' rất cụ thể đối với phân cấp lớp của bạn. Mặt khác, khi bạn phát hiện ra rằng các triển khai phương pháp mẫu của bạn là thừa hoặc dẫn đến mã trùng lặp trên một số lớp con của cùng một cây, hãy chọn mẫu Chiến lược để mã của bạn sẽ được nhân số hóa.

Ngoài ra, phương thức mẫu hoạt động theo cách phân lớp, bạn không thể thay đổi hành vi của mình khi chạy trong khi với mẫu Chiến lược, tất cả những gì bạn phải làm là sử dụng setter để thay đổi hành vi của bạn bất cứ khi nào bạn muốn.

Trong tất cả các trường hợp khác, hai mẫu này rất giống nhau và bạn thường có thể chọn kiểu bạn thích.

2

Có, bạn có thể sử dụng mẫu chiến lược thay vì phương pháp mẫu nhưng trong trường hợp đặc biệt, bạn sẽ lặp lại logic thuật toán.

Trường hợp sử dụng tốt nhất cho phương pháp mẫu để thay thế một số phương pháp trừu tượng bằng cách triển khai cụ thể.

Ví dụ: Bạn muốn nấu ăn smth và công thức nấu ăn của bạn là:

  1. mất ingridients
  2. đặt chúng vào
  3. nhiệt
  4. cho thực phẩm coocked để smbd

Trong java thức chỉ là phương pháp trong một số Recipe class

void cook(){ 
    takeIngridients(); 
    putIt(); // abstract 
    heat(); //abstract 
    giveFood(); 
} 

Bạn tạo lớp PanRecipe mở rộng Recipe và triển khai phương pháp trừu tượng để sử dụng chảo. Một lớp khác có thể là GrillRecipe và thực hiện các phương pháp để sử dụng nướng. Bây giờ bạn chỉ có thể gọi nó bằng grillRecipe.cook() và thay vì mẫu chiến lược không cần sao chép việc triển khai các phương pháp lặp lại takeIngridientsgiveFood.

3

Mô hình Strategy xác định nhóm thuật toán và làm cho chúng hoán đổi cho nhau. Mã máy khách có thể sử dụng các thuật toán khác nhau vì các thuật toán được đóng gói.

Phương thức Template xác định phác thảo của thuật toán và cho phép lớp con một phần của việc triển khai thuật toán.Vì vậy, bạn có thể có việc thực hiện khác nhau của một bước thuật toán nhưng giữ lại cấu trúc của thuật toán

Như bạn có thể nhìn thấy ý định là khác nhau ở mỗi mẫu. Vì vậy, nó không phải là một vấn đề lợi thế của một trong những khác.

1

tương đồng:

  1. Cả Template phương pháp & Chiến lược là mô hình hành vi.
  2. Cả hai mô hình được sử dụng để thay đổi một thuật toán bởi các lớp học phụ nhưng với một sự khác biệt - một phần hoặc toàn

Đối hiểu rõ hơn về hai tính năng này, chúng ta phải hiểu sự khác biệt cốt lõi trong việc thực hiện hai mô hình này.

khác biệt cốt lõi:

  1. Template phương pháp sử dụng thừa kế và Chiến lược sử dụng thành phần
  2. Phương pháp Template thực hiện bởi các lớp cơ sở không nên được ghi đè. Bằng cách này, cấu trúc của thuật toán được điều khiển bởi lớp siêu, và các chi tiết được thực hiện trong các lớp tiểu
  3. Chiến lược gói gọn các thuật toán đằng sau một giao diện, trong đó cung cấp cho chúng khả năng thay đổi thuật toán tại thời gian chạy

bài viết liên quan:

Real World Example of the Strategy Pattern

Template design pattern in JDK, could not find a method defining set of methods to be executed in order

Hãy xem Template methodStrategy bài viết để hiểu rõ hơn.

Các vấn đề liên quan