7

Tôi có một số lớp Java thực hiện mẫu chiến lược. Mỗi lớp có các thông số số khác nhau:Mô hình chiến lược được mô phỏng

interface Strategy { 
    public data execute(data); 
} 

class StrategyA implements Strategy { 
    public data execute(data); 
} 

class StrategyB implements Strategy { 
     public StrategyB(int paramA, int paramB); 
     public data execute(data); 
} 

class StrategyC implements Strategy { 
     public StrategyC(int paramA, String paramB, double paramC); 
     public data execute(data); 
} 

Bây giờ tôi muốn người dùng có thể nhập các tham số trong một số loại giao diện người dùng. Giao diện người dùng nên được chọn khi chạy, tức là các chiến lược phải độc lập với giao diện người dùng đó. Hộp thoại tham số không được là nguyên khối và sẽ có khả năng làm cho nó hoạt động và trông khác nhau cho mỗi chiến lược và giao diện người dùng (ví dụ: giao diện điều khiển hoặc Swing).

Bạn giải quyết vấn đề này như thế nào?

Trả lời

4

Một khả năng để làm điều đó là có một cái gì đó tương tự như các mẫu thiết kế Builder:

Đối với tất cả các loại chiến lược bạn nên có một người thợ xây tương ứng (một hoặc nhiều). Trình xây dựng không hoạt động như một người xây dựng bình thường nhận tất cả các tham số init làm đối số phương thức; Thay vào đó, cần khối cho đến khi nhận được đầu vào tương ứng. Một số nhà xây dựng sẽ hiển thị một hộp thoại Swing và chờ đợi, những người khác sẽ in ra bàn điều khiển và chờ đầu vào, những người khác có thể đọc từ một tập tin, vv Sau khi người xây dựng nhận được tất cả các yếu tố đầu vào, nó có thể tạo ra thể hiện chiến lược và trả lại nó.

Bằng cách này, bạn tách logic truy xuất dữ liệu khỏi chính chiến lược. Một lợi ích khác là bạn có thể có một giao diện chung của tất cả các nhà xây dựng, vì vậy khi bạn chọn một người xây dựng cụ thể, bạn có thể thao tác nó với cùng một đoạn mã.

+0

+1 Nói cách khác, bản thân người xây dựng sẽ là chiến lược. Tốt đẹp. –

1

Giải pháp của vấn đề này phụ thuộc chủ yếu vào những gì xác định chiến lược nào là chiến lược hiện tại. Để đơn giản, tôi giả định rằng giao diện người dùng giống nhau cho tất cả các chiến lược.

Thực tế bạn sẽ tạo lớp trình xây dựng hoặc phương pháp nhà máy. Một cái gì đó dọc theo dòng này:

interface StrategyPicker { 
    public Strategy getStrategy(); 
} 

// Most likely used in the JFrame it is added to 
class StrategyPickerUI extends JPanel implements StrategyPicker { 
    // initialize the panel with all the widgets 
    // and implement the getStrategy method. the getStrategy 
    // method should be called after the input is done in this 
    // panel (such as clicking an Ok or Apply button) 
} 

// You can also make one for the console app 
class StrategyPickerSimple implements StrategyPicker { 
    // ... 
} 

Nếu bạn muốn trở thành ưa thích thật bạn tạo ra một lớp nhà máy đơn giản để loại bỏ các hành động tạo thành lớp riêng của nó:

public class StrategyFactory() { 
    public static Strategy createStrategyFromParameters(StrategyParams sp) { 
     // creates the Strategy object... doesn't need to be public static 
     // and if it isn't, it will help making unit tests easier 
    } 

    // This nested class could be split up to StrategyAParams, 
    // StrategyBParams, StrategyCParams 
    public class StrategyParams { 
     data paramA; 
     int paramB_A; 
     int paramB_B; 
     int paramC_A; 
     String paramC_B; 
     float paramC_C; 
    } 
} 

// in StrategyPickerUI class 
    public getStrategy() { 
     StrategyParams sp = new StrategyParams(); 
     sp.paramB_A = myJTextFieldParamB_A.getText(); 
      // and so on... 
     return StrategyFactory.createStrategyFromParameters(sp); 
    } 

Nếu bạn muốn giữ lại giao diện người dùng không nguyên khối, sau đó chia trách nhiệm cho các vật thể của mình. Hi vọng điêu nay co ich.

0

Nếu các lớp thông số của bạn chứa đối tượng đơn giản (Số, Boolean, Ngày, Chuỗi), bạn có thể thử tạo giao diện của mình khi chạy.

Nó sẽ khó khăn hơn để tạo ra một giao diện người dùng cho các đối tượng sáng tác và thu thập các thông số

Có một cái nhìn để Metawidget đó là một máy phát điện ui mạnh mẽ.