Câu hỏi Ví dụ thế giới thực của mẫu chiến lược


Tôi đã đọc về Hiệu trưởng OCP và cách sử dụng mẫu chiến lược để thực hiện điều này.

Tôi sẽ cố gắng giải thích điều này cho một vài người, nhưng ví dụ duy nhất tôi có thể nghĩ là sử dụng các lớp xác nhận khác nhau dựa trên trạng thái "thứ tự" là gì.

Tôi đã đọc một vài bài báo trực tuyến, nhưng những điều này thường không mô tả một lý do thực sự thích hợp để sử dụng chiến lược, như tạo báo cáo / hóa đơn / xác thực, v.v ...

Có bất kỳ ví dụ thế giới thực nào mà bạn cho rằng một mô hình chiến lược là phổ biến không?


76
2017-12-16 01:29


gốc




Các câu trả lời:


Cái này thì sao:

Bạn phải mã hóa một tệp.

Đối với các tệp nhỏ, bạn có thể sử dụng chiến lược "trong bộ nhớ", nơi tệp hoàn chỉnh được đọc và lưu trong bộ nhớ (giả sử đối với tệp <1 gb)

Đối với các tệp lớn, bạn có thể sử dụng một chiến lược khác, nơi các phần của tệp được đọc trong bộ nhớ và kết quả được mã hóa một phần được lưu trữ trong các tệp tmp.

Đây có thể là hai chiến lược khác nhau cho cùng một nhiệm vụ.

Mã máy khách sẽ giống nhau:

 File file = getFile();
 Cipher c = CipherFactory.getCipher( file.size() );
 c.performAction();



// implementations:
interface  Cipher  {
     public void performAction();
}

class InMemoryCipherStrategy implements Cipher { 
         public void performAction() {
             // load in byte[] ....
         }
}

class SwaptToDiskCipher implements Cipher { 
         public void performAction() {
             // swapt partial results to file.
         }

}

Các

     Cipher c = CipherFactory.getCipher( file.size() );

Sẽ trả về trường hợp chiến lược chính xác cho mật mã.

Tôi hi vọng cái này giúp được.

(Tôi thậm chí không biết nếu Cipher là đúng từ: P)


86
2017-12-16 01:40



Ví dụ của bạn không phải là một Mẫu Nhà máy hơn? Ngoài ra tôi nghĩ rằng nó sẽ không làm việc trong C # ví dụ. Phương thức getCipher () của bạn là một phương thức tĩnh nhưng trong C # bạn không thể định nghĩa một phương thức tĩnh trên một giao diện (không phải trong Java mà tôi nghĩ nhưng vì điều này tôi không chắc chắn). - FrenchData
Họ đi cùng nhau. Nhà máy tạo ra chiến lược, nhưng chiến lược nó tự giữ thuật toán để thực hiện (về cơ bản) hoạt động tương tự. Chiến lược cũng có thể được thay đổi khi chạy. Về phương pháp nhà máy bạn đúng, tôi đã thay đổi nó. - OscarRyz
Để thêm vào điểm Osacars, không có nhà máy, điều này có thể được tạo mà không cần nhà máy Cipher C =null; if (file.size() <= 2048) { C = new InMemoryCipherStrategy(); } else { c= SwaptToDiskCipher (); } - Abhijit Mazumder
Đồng ý với @FrenchData. Trong khi là một sự hiện diện ví dụ tuyệt vời của CipherFactory có thể làm lẫn lộn những người không quen thuộc với mẫu Chiến lược. - Tim Bezhashvyly
Mô hình nhà máy là về sáng tạo, Chiến lược là về Hành vi. Có một chút khác biệt phải không? - nhoxbypass


Một lần nữa, một bài cũ nhưng vẫn bật lên trên tìm kiếm vì vậy tôi sẽ thêm hai ví dụ nữa (Code là trong C #). Tôi hoàn toàn yêu thích mô hình Chiến lược vì nó đã lưu lại rất nhiều lần khi người quản lý dự án nói: "Chúng tôi muốn ứng dụng làm 'X', nhưng 'X' chưa rõ ràng và có thể thay đổi trong tương lai gần. " Điều này video giải thích mẫu chiến lược, sử dụng StarCraft làm ví dụ.

Nội dung nằm trong danh mục này:

  • Sắp xếp: Chúng tôi muốn sắp xếp những con số này, nhưng chúng tôi không biết liệu chúng ta sẽ sử dụng BrickSort, BubbleSort hay một số phân loại khác

  • Xác nhận: Chúng tôi cần kiểm tra các mục theo "Một số quy tắc", nhưng vẫn chưa rõ quy tắc đó sẽ là gì và chúng tôi có thể nghĩ đến các quy tắc mới.

  • Trò chơi: Chúng tôi muốn người chơi đi bộ hoặc chạy khi anh ấy di chuyển, nhưng có thể trong tương lai, anh ấy cũng có thể bơi, bay, dịch chuyển, đào hang ngầm, v.v.

  • Lưu trữ thông tin: Chúng tôi muốn ứng dụng lưu trữ thông tin vào Cơ sở dữ liệu, nhưng sau này có thể cần phải lưu tệp hoặc tạo webcall

  • Xuất ra: Chúng tôi cần xuất X thành một chuỗi đơn giản, nhưng sau này có thể là CSV, XML, JSON, v.v.


Ví dụ

Tôi có một dự án mà người dùng có thể gán sản phẩm cho mọi người trong cơ sở dữ liệu. Việc gán sản phẩm này cho một người có trạng thái "Được chấp thuận" hoặc "Bị từ chối", phụ thuộc vào một số quy tắc kinh doanh. Ví dụ: nếu người dùng chỉ định một sản phẩm cho một người có độ tuổi nhất định, trạng thái của nó sẽ bị từ chối; Nếu sự khác biệt giữa hai trường trong mục lớn hơn 50, trạng thái của nó bị từ chối, v.v.

Bây giờ, tại thời điểm phát triển các quy tắc kinh doanh này chưa hoàn toàn rõ ràng, và các quy tắc mới có thể xuất hiện bất cứ lúc nào. Sức mạnh của mô hình căng thẳng là tôi đã tạo ra một RuleAgent, được đưa ra một danh sách các IRules.

public interface IRule {
    bool IsApproved(Assignment assignment); 
 }

Tại thời điểm gán một sản phẩm cho một người, tôi tạo ra một RuleAgent, cung cấp cho nó một danh sách các quy tắc (mà tất cả đều thực hiện IRule) và yêu cầu nó xác nhận một nhiệm vụ. Nó sẽ chạy qua tất cả các quy tắc của nó. Mà, bởi vì tất cả chúng đều thực hiện cùng một giao diện, tất cả đều có IsApproved và trả về false nếu có bất kỳ lỗi nào trả về false.

Bây giờ, khi người quản lý đột nhiên xuất hiện và nói, chúng tôi cũng cần từ chối tất cả các bài tập cho người thực tập, hoặc tất cả các bài tập cho những người làm thêm giờ ... Bạn tạo các lớp mới như sau:

public OvertimeRule : IRule
{
    public bool IsApproved(Assignment assignment) //Interface method
    {
        if (assignment.Person.Timesheet >= 40)
        {
            return false;
        }
        return true;
    }
}

public InternRule : IRule
{
    public bool IsApproved(Assignment assignment) //Interface method
    {
        if (assignment.Person.Title == "Intern")
        {
            return false;
        }
        return true;
    }
}

Bạn thấy rằng bạn không phải tiếp tục thêm hoặc loại bỏ if-statements hoặc code, chỉ cần tạo một lớp quy tắc mới thực hiện giao diện IRUle và chuyển đổi chúng ra khi cần.


Một ví dụ tuyệt vời khác: loạt video của Scott Allen tại http://www.asp.net/mvc/pluralsight nơi anh ta sử dụng mẫu chiến lược trong phần Đơn vị kiểm thử của ứng dụng

Anh ấy xây dựng một trang web có trang hiển thị các mục dựa trên mức độ phổ biến. Tuy nhiên, "Phổ biến" có thể là nhiều thứ (hầu hết lượt xem, hầu hết người đăng ký, ngày tạo, hoạt động nhiều nhất, số lượng nhận xét ít nhất, v.v.) và trong trường hợp quản lý chưa biết chính xác cách đặt hàng và có thể muốn thử nghiệm với đặt hàng vào một ngày sau đó. Bạn tạo một giao diện (IOrderAlgorithm hoặc một cái gì đó) với một phương thức thứ tự, và để cho một đối tượng Orderer ủy nhiệm thứ tự để thực hiện cụ thể giao diện IOrderAlgorithm. Bạn có thể tạo một "CommentOrderer", "ActivityOrderer", v.v. Và chỉ chuyển đổi chúng khi yêu cầu mới xuất hiện.


43
2018-01-16 14:57





Tôi có thể nghĩ ra một số ví dụ khá đơn giản:

  • Sắp xếp danh sách. Chiến lược là so sánh được sử dụng để quyết định xem hai mục nào trong danh sách là "Đầu tiên"
  • Bạn có thể có một ứng dụng mà thuật toán sắp xếp chính nó (QuickSort, HeapSort, vv) có thể được chọn khi chạy
  • Trình bổ sung, bố cục và bộ lọc trong Log4Net và Log4j
  • Người quản lý bố cục trong bộ công cụ giao diện người dùng
  • Nén dữ liệu. Bạn có thể có một giao diện ICompressor có phương pháp duy nhất trông giống như sau:

    đầu vào byte [] nén (byte []);

    Các lớp nén cụ thể của bạn có thể là những thứ như RunLengthCompression, DeflateCompression, v.v.


11
2018-01-08 21:07





Một cách sử dụng phổ biến của mẫu chiến lược là xác định các chiến lược sắp xếp tùy chỉnh (bằng các ngôn ngữ không có hàm bậc cao hơn), ví dụ: để sắp xếp danh sách các chuỗi theo chiều dài trong Java, chuyển một lớp bên trong vô danh (một triển khai thực hiện giao diện chiến lược):

List<String> names = Arrays.asList("Anne", "Joe", "Harry");
Collections.sort(names, new Comparator<String>() {
  public int compare(String o1, String o2) {
    return o1.length() - o2.length();
  }
});
Assert.assertEquals(Arrays.asList("Joe", "Anne", "Harry"), names);

Theo cách tương tự, các chiến lược có thể được sử dụng cho các truy vấn gốc với cơ sở dữ liệu đối tượng, ví dụ: trong db4o:

List<Document> set = db.query(new Predicate<Document>() {
  public boolean match(Document candidate) {
    return candidate.getSource().contains(source);
  }
});

9
2018-01-11 16:12





Tôi có một ứng dụng đồng bộ hóa cơ sở người dùng của nó mỗi ngày với thư mục doanh nghiệp của chúng tôi. Người dùng đủ điều kiện hoặc không đủ điều kiện dựa trên trạng thái của họ trong trường Đại học. Mỗi ngày, chương trình cung cấp thông qua và đảm bảo rằng những người được cho là đủ điều kiện được cung cấp trong ứng dụng và những người không được cấp phép (thực sự theo một thuật toán giảm sút duyên dáng, nhưng đó là bên cạnh điểm). Vào thứ bảy, tôi cập nhật toàn diện hơn để đồng bộ hóa một số thuộc tính của từng người dùng cũng như đảm bảo rằng họ có đủ điều kiện thích hợp. Vào cuối tháng, tôi xử lý một số hóa đơn dựa trên mức sử dụng cho tháng đó.

Tôi sử dụng một mô hình chiến lược tổng hợp để thực hiện việc đồng bộ hóa này. Chương trình chính về cơ bản chọn một chiến lược tổng thể tùy thuộc vào ngày trong tuần (chỉ thay đổi đồng bộ / đồng bộ hóa tất cả) và thời gian học kỳ liên quan đến lịch học. Nếu chu kỳ thanh toán kết thúc, khi đó chu kỳ thanh toán sẽ kết thúc với chiến lược thanh toán. Sau đó nó chạy chiến lược đã chọn thông qua một giao diện chuẩn.

Tôi không biết nó phổ biến như thế nào, nhưng tôi cảm thấy nó hoàn toàn phù hợp với mô hình chiến lược.


8
2017-12-16 02:36



Đây là một ví dụ rất hay. Ngoài ra, nó rõ ràng cho bạn biết sự khác biệt giữa mô hình lệnh và chiến lược trong tóm tắt - mục đích. "Chương trình chính về cơ bản chọn một chiến lược tổng thể tùy thuộc vào ngày trong tuần " - Utsav T


Ghi chú chính:

  1. Chiến lược là kiểu thiết kế hành vi. Nó được sử dụng để chuyển đổi giữa gia đình của các thuật toán.

  2. Mẫu này chứa một chiến lược trừu tượng giao diện và nhiều bê tông triển khai chiến lược (thuật toán) của giao diện đó.

  3. Ứng dụng sử dụng chiến lược giao diện chỉ có. Tùy thuộc vào một số thông số cấu hình, chiến lược cụ thể sẽ được gắn thẻ giao diện.

Sơ đồ UML từ wikipedia

enter image description here

Một ví dụ từ thực tế: Các hãng hàng không giảm giá trong một vài tháng (tháng 7-12). Bạn có thể có một Giá vé mô-đun, quyết định tùy chọn giá tùy thuộc vào số tháng.

Hãy xem một ví dụ đơn giản. Ví dụ này có thể được mở rộng cho các ứng dụng bán lẻ trực tuyến, giúp giảm giá cho các mặt hàng mua sắm vào những ngày đặc biệt / giờ hạnh phúc một cách dễ dàng.

import java.util.*;

/* Interface for Strategy */
interface OfferStrategy {
    public String getName();
    public double getDiscountPercentage();
}
/* Concrete implementation of base Strategy */
class NoDiscountStrategy implements OfferStrategy{
    public String getName(){
        return this.getClass().getName();
    }
    public double getDiscountPercentage(){
        return 0;
    }
}
/* Concrete implementation of base Strategy */
class QuarterDiscountStrategy implements OfferStrategy{
    public String getName(){
        return this.getClass().getName();
    }
    public double getDiscountPercentage(){
        return 0.25;
    }
}
/* Context is optional. But if it is present, it acts as single point of contact
   for client. 

   Multiple uses of Context
   1. It can populate data to execute an operation of strategy
   2. It can take independent decision on Strategy creation. 
   3. In absence of Context, client should be aware of concrete strategies. Context acts a wrapper and hides internals
   4. Code re-factoring will become easy
*/
class StrategyContext {
    double price; // price for some item or air ticket etc.
    Map<String,OfferStrategy> strategyContext = new HashMap<String,OfferStrategy>();
    StrategyContext(double price){
        this.price= price;
        strategyContext.put(NoDiscountStrategy.class.getName(),new NoDiscountStrategy());
        strategyContext.put(QuarterDiscountStrategy.class.getName(),new QuarterDiscountStrategy());        
    }
    public void applyStrategy(OfferStrategy strategy){
        /* 
        Currently applyStrategy has simple implementation. You can use Context for populating some more information,
        which is required to call a particular operation            
        */
        System.out.println("Price before offer :"+price);
        double finalPrice = price - (price*strategy.getDiscountPercentage());
        System.out.println("Price after offer:"+finalPrice);
    }
    public OfferStrategy getStrategy(int monthNo){
        /*
            In absence of this Context method, client has to import relevant concrete Strategies everywhere.
            Context acts as single point of contact for the Client to get relevant Strategy
        */
        if ( monthNo < 6 )  {
            return strategyContext.get(NoDiscountStrategy.class.getName());
        }else{
            return strategyContext.get(QuarterDiscountStrategy.class.getName());
        }

    }
}
public class StrategyDemo{    
    public static void main(String args[]){
        StrategyContext context = new StrategyContext(100);
        System.out.println("Enter month number between 1 and 12");
        int month = Integer.parseInt(args[0]);
        System.out.println("Month ="+month);
        OfferStrategy strategy = context.getStrategy(month);
        context.applyStrategy(strategy);
    }

}

đầu ra:

Enter month number between 1 and 12
Month =1
Price before offer :100.0
Price after offer:100.0

Enter month number between 1 and 12
Month =7
Price before offer :100.0
Price after offer:75.0

Bài viết hữu ích:

chiến lược mô hình bởi dzone

chiến lược mô hình của sourcemaking


8
2018-02-03 14:52





Tôi biết đây là một câu hỏi cũ, nhưng tôi nghĩ tôi có một ví dụ thú vị khác mà tôi đã thực hiện gần đây.

Đây là một ví dụ rất thực tế về mô hình chiến lược được sử dụng trong một hệ thống phân phối tài liệu.

Tôi đã có một hệ thống phân phối PDF nhận được một kho lưu trữ chứa nhiều tài liệu và một số siêu dữ liệu. Dựa trên siêu dữ liệu, nó quyết định vị trí đặt tài liệu vào; nói, tùy thuộc vào dữ liệu, tôi có thể lưu trữ tài liệu A, B, hoặc là C hệ thống lưu trữ hoặc kết hợp cả ba.

Các khách hàng khác nhau sử dụng hệ thống này và họ có các yêu cầu xử lý lỗi rollback / lỗi khác nhau trong trường hợp lỗi: một người muốn hệ thống phân phối dừng lỗi đầu tiên, để lại tất cả tài liệu đã được gửi trong kho của họ, nhưng dừng quá trình và không phân phối bất kỳ thứ gì khác ; một người khác muốn nó quay trở lại từ B trong trường hợp có lỗi khi lưu trữ C, nhưng để lại mọi thứ đã được gửi đến A. Thật dễ dàng để tưởng tượng rằng người thứ ba hoặc thứ tư cũng sẽ có những nhu cầu khác nhau.

Để giải quyết vấn đề này, tôi đã tạo một lớp phân phối cơ bản chứa logic phân phối, cộng với các phương thức để cuộn lại các công cụ từ tất cả các kho lưu trữ. Những phương pháp này không thực sự được gọi bởi hệ thống phân phối trực tiếp trong trường hợp có lỗi. Thay vào đó, lớp này sử dụng Dependency Injection để nhận một lớp "Rollback / Error Handling Strategy" (dựa trên khách hàng sử dụng hệ thống), được gọi là trong trường hợp lỗi, do đó gọi các phương thức rollback nếu nó phù hợp với chiến lược đó.

Bản thân lớp phân phối báo cáo những gì đang xảy ra với lớp chiến lược (những tài liệu nào được gửi tới kho lưu trữ nào và những gì xảy ra), và bất cứ khi nào có lỗi xảy ra, nó sẽ hỏi chiến lược có tiếp tục hay không. Nếu chiến lược nói "dừng nó", lớp này gọi phương thức "cleanup" của chiến lược, sử dụng thông tin được báo cáo trước đây để quyết định phương thức rollback nào cần gọi từ lớp phân phối hoặc đơn giản là không làm gì cả.

rollbackStrategy.reportSuccessA(...);
rollbackStrategy.reportFailureB(...);

if (rollbackStrategy.mustAbort()) {
    rollbackStrategy.rollback(); // rollback whatever is needed based on reports
    return false;
}

Vì vậy, bây giờ tôi có hai chiến lược khác nhau: một là QuitterStrategy (mà thoát khỏi lỗi đầu tiên và làm sạch không có gì) và một trong những khác là MaximizeDeliveryToAStrategy (cố gắng hết sức để không hủy bỏ quy trình và không bao giờ chuyển các nội dung được lưu vào bộ nhớ A, nhưng quay lại nội dung từ B nếu giao hàng đến C thất bại).

Từ sự hiểu biết của tôi, đây là một ví dụ về mô hình chiến lược. Nếu bạn (có, bạn đọc) nghĩ rằng tôi sai, xin vui lòng bình luận dưới đây và cho tôi biết. Tôi tò mò về những gì sẽ cấu thành việc sử dụng "thuần túy" mô hình chiến lược và những khía cạnh nào trong việc triển khai của tôi vi phạm định nghĩa. Tôi nghĩ có vẻ hơi buồn cười vì giao diện chiến lược hơi béo. Tất cả các ví dụ tôi đã nhìn thấy cho đến nay chỉ sử dụng một phương pháp, nhưng tôi vẫn nghĩ rằng điều này đóng gói một thuật toán (nếu một phần của logic kinh doanh có thể được coi là một thuật toán, mà tôi nghĩ rằng nó không).

Vì chiến lược cũng được thông báo về các sự kiện trong quá trình thực hiện phân phối, nó cũng có thể được coi là một Người quan sát, nhưng nó là một câu chuyện khác.

Từ một nghiên cứu nhỏ, có vẻ như đây là một "mẫu ghép" (giống như MVC, một mẫu sử dụng nhiều mẫu thiết kế bên dưới theo một cách cụ thể) được gọi là Cố vấn. Đó là một cố vấn về việc liệu việc phân phối có nên tiếp tục hay không, nhưng nó cũng là một trình xử lý lỗi hoạt động vì nó có thể khôi phục nội dung khi được yêu cầu.

Dù sao, đây là một ví dụ khá phức tạp mà có thể làm cho cảm giác của bạn mà sử dụng các mô hình chiến lược là tất cả quá đơn giản / ngớ ngẩn. Nó có thể được thực sự phức tạp và thậm chí áp dụng nhiều hơn khi được sử dụng cùng với các mẫu khác.


7
2017-10-05 05:57





Mẫu chiến lược là mẫu được sử dụng phổ biến nhất dành riêng cho các thuật toán xác thực và sắp xếp.

Hãy để tôi giải thích với một ví dụ thực tế đơn giản

enum Speed {
  SLOW, MEDIUM, FAST;
}

class Sorter {
 public void sort(int[] input, Speed speed) {
    SortStrategy strategy = null;
    switch (speed) {
    case SLOW:
        strategy = new SlowBubbleSortStrategy();
        break;
    case MEDIUM:
        strategy = new MediumInsertationSortStrategy();
        break;

    case FAST:
        strategy = new FastQuickSortStrategy();
        break;
    default:
        strategy = new MediumInsertationSortStrategy();
    }
    strategy.sort(input);
 }

}

interface SortStrategy {

    public void sort(int[] input);
}

class SlowBubbleSortStrategy implements SortStrategy {

   public void sort(int[] input) {
    for (int i = 0; i < input.length; i++) {
        for (int j = i + 1; j < input.length; j++) {
            if (input[i] > input[j]) {
                int tmp = input[i];
                input[i] = input[j];
                input[j] = tmp;
            }
        }
    }
    System.out.println("Slow sorting is done and the result is :");
    for (int i : input) {
        System.out.print(i + ",");
    }
  }

 }

class MediumInsertationSortStrategy implements SortStrategy {

public void sort(int[] input) {
    for (int i = 0; i < input.length - 1; i++) {
        int k = i + 1;
        int nxtVal = input[k];
        while (input[k - 1] > nxtVal) {
            input[k] = input[k - 1];
            k--;
            if (k == 0)
                break;
        }
        input[k] = nxtVal;
    }
    System.out.println("Medium sorting is done and the result is :");
    for (int i : input) {
        System.out.print(i + ",");
    }

 }

}

class FastQuickSortStrategy implements SortStrategy {

public void sort(int[] input) {
    sort(input, 0, input.length-1);
    System.out.println("Fast sorting is done and the result is :");
    for (int i : input) {
        System.out.print(i + ",");
    }
}

private void sort(int[] input, int startIndx, int endIndx) {
    int endIndexOrig = endIndx;
    int startIndexOrig = startIndx;
    if( startIndx >= endIndx)
        return;
    int pavitVal = input[endIndx];
    while (startIndx <= endIndx) {
        while (input[startIndx] < pavitVal)
            startIndx++;
        while (input[endIndx] > pavitVal)
            endIndx--;
        if( startIndx <= endIndx){
            int tmp = input[startIndx];
            input[startIndx] = input[endIndx];
            input[endIndx] = tmp;
            startIndx++;
            endIndx--;
        }
    }
    sort(input, startIndexOrig, endIndx);
    sort(input, startIndx, endIndexOrig);
 }

}  

Mã thử nghiệm cho điều này là

public class StrategyPattern {
  public static void main(String[] args) {
    Sorter sorter = new Sorter();
    int[] input = new int[] {7,1,23,22,22,11,0,21,1,2,334,45,6,11,2};
    System.out.print("Input is : ");
    for (int i : input) {
        System.out.print(i + ",");
    }
    System.out.println();
    sorter.sort(input, Speed.SLOW);
 }

}

Ví dụ tương tự được lấy từ http://coder2design.com/strategy-pattern/


5
2017-07-08 11:38



Sử dụng khác nhau của mẫu chiến lược: Xác thực: Khi có nhiều xác thực cần được thực hiện trong mã của bạn. Các thuật toán khác nhau: Đặc biệt khi có thể sử dụng các thuật toán sắp xếp khác nhau, ví dụ: sắp xếp bong bóng hoặc sắp xếp nhanh. Lưu trữ thông tin: Khi chúng tôi có thể thông tin ở những nơi khác nhau, ví dụ: cơ sở dữ liệu hoặc hệ thống tệp. Phân tích cú pháp: trong khi phân tích cú pháp chúng ta có thể sử dụng chiến lược khác nhau cho các đầu vào khác nhau. Chiến lược lọc. Bố cục chiến lược. - Jatinder Pal


Một ví dụ tốt về mô hình chiến lược sẽ là một trò chơi mà chúng ta có thể có các nhân vật khác nhau và mỗi nhân vật có thể có nhiều vũ khí để tấn công nhưng tại một thời điểm chỉ có thể sử dụng một vũ khí. Vì vậy, chúng tôi có nhân vật như bối cảnh, ví dụ như King, Commander, Knight, Soldier  và vũ khí là một chiến lược mà tấn công () có thể là phương pháp / thuật toán phụ thuộc vào vũ khí được sử dụng. Vì vậy, nếu các lớp vũ khí cụ thể là Sword, Axe, Crossbow, BowAndArrow, vv .. tất cả chúng sẽ thực hiện phương thức attack (). Tôi chắc chắn không cần giải thích thêm.


3
2018-01-15 16:08



Tôi nghĩ rằng câu trả lời được chấp nhận được cho là để nói về ví dụ này :) - Jeancarlo Fontalvo