7

Strateji modelini uygulayan birkaç Java sınıfım var. Her sınıf farklı türde değişken sayısı parametresi vardır: Parametreli Strateji Örneği

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); 
} 

Şimdi kullanıcı arayüzünün çeşit parametreleri girebilirsiniz istiyorum. UI çalışma zamanında seçilmelidir, yani stratejiler bundan bağımsız olmalıdır. Parametre iletişim kutusu monolitik olmamalıdır ve her strateji ve kullanıcı arabirimi (örn. Konsol veya Swing) için davranmasını ve farklı görünmesini sağlama olasılığı olmalıdır.

Bu sorunu nasıl çözerdiniz?

cevap

4

Bir olasılık yapmak o Oluşturucu tasarım desenine benzer bir şey ile geçerli:

Eğer karşılık gelen oluşturucu (bir veya daha fazla) sahip olmalıdır Her strateji tipi için. Oluşturucu, tüm init paramlarını yöntem argümanları olarak alan normal bir kurucu olarak çalışmaz; Bunun yerine, ilgili giriş alınana kadar numaralı bloğu almalıdır. Bazı geliştiriciler bir Swing iletişim kutusu gösterecek ve bekleyecek, diğerleri konsola yazacak ve girişleri bekleyecek, diğerleri bir dosyadan okuyabilecek, vb. Bir oluşturucu tüm girdileri aldıktan sonra, strateji örneğini oluşturabilir ve geri verebilir.

Bu sayede veri alma mantığını stratejinin kendisinden ayırabilirsiniz. Diğer bir avantajı, tüm kurucuların genel bir arayüzüne sahip olmanızdır, bu yüzden belirli bir kurucuyu seçtiğinizde, aynı kod parçasıyla işlem yapabilirsiniz.

+0

+1 Başka bir deyişle, yapımcıların kendileri için stratejiler olabilir. Güzel. –

1

Bu sorunun çözümü temel olarak hangi stratejinin geçerli olanı belirleyene bağlıdır. Basitlik için UI'nin tüm stratejiler için aynı olduğunu varsayıyorum.

Pratik olarak bir yapımcı sınıfı veya bir fabrika yöntemi oluşturuyor olacaksınız. Bu hat boyunca bir şey: Eğer gerçek fantezi olmasını istiyorsanız

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 { 
    // ... 
} 

Eğer kendi var sınıfa yaratma eylemini kaldırmak için basit bir fabrika sınıf oluşturmak: Eğer UI tutmak istiyorsanız

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); 
    } 

monolitik olmayan, sonra sorumlulukları kendi nesnelerine böler. Bu yardımcı olur umarım.

0

Parametre sınıflarınız basit bir nesne (Sayılar, Boole, Tarih, Dize) içeriyorsa, çalışma zamanında arayüzünüzü oluşturmayı deneyebilirsiniz.

oluşan nesneler ve parametreleri

toplanması için bir UI oluşturmak güçlü bir ui jeneratörü Metawidget için göz için daha zor olacaktır.