it-swarm.asia

Gerçek Dünya Strateji Deseni Örneği

OCP sorumlusu ve bunu başarmak için strateji modelinin nasıl kullanılacağı hakkında okuyordum.

Bunu birkaç kişiye açıklamaya çalışacaktım, ancak düşünebildiğim tek örnek bir "düzenin" hangi duruma bağlı olduğuna bağlı olarak farklı doğrulama sınıfları kullanmak.

Çevrimiçi olarak birkaç makale okudum, ancak bunlar genellikle raporları/faturaları/onaylama vb.

Bir strateji modelinin yaygın olduğunu düşündüğünüz gerçek dünya örnekleri var mı?

81
Tired

Peki buna ne dersin: 

Bir dosyayı şifrelemek zorundasın. 

Küçük dosyalar için, tam dosyanın okunduğu ve bellekte tutulduğu "bellekte" stratejisini kullanabilirsiniz (diyelim ki <1 gb arası dosyalar için 

Büyük dosyalar için, dosyanın parçalarının bellekte okunduğu ve kısmi şifreli sonuçların tmp dosyalarında saklandığı başka bir strateji kullanabilirsiniz.

Bunlar aynı görev için iki farklı strateji olabilir.

Müşteri kodu aynı gözükür:

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

}

 

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

Şifre için doğru strateji örneğini döndürürdü.

Umarım bu yardımcı olur.

(Şifrenin doğru Kelime olup olmadığını bile bilmiyorum: P)

87
OscarRyz

Yine eski bir gönderi ama yine de aramalarda ortaya çıkıyor bu yüzden iki örnek daha ekleyeceğim (Kod C # ile). Strateji modelini kesinlikle çok seviyorum, çünkü proje yöneticileri şöyle diyor: “Uygulamanın 'X' yapmasını istiyoruz, ancak 'X' henüz net değil ve yakın gelecekte değişebilir. " Bu strateji modelini açıklayan video , StarCraft'ı örnek olarak kullanıyor.

Bu kategoriye giren sayfalar:

  • Sıralama: Bu numaraları sıralamak istiyoruz, ancak BrickSort, BubbleSort veya başka bir sıralama kullanıp kullanmayacağımızı bilmiyoruz.

  • Doğrulama: Maddeleri "Bazı kurallara" göre kontrol etmemiz gerekiyor, ancak bu kuralın ne olacağı henüz belli değil ve yenilerini düşünebiliriz.

  • Oyunlar: Oyuncunun hareket ederken ya yürümesini ya da koşmasını isteriz, ancak gelecekte de yüzebilecek, uçabilecek, ışınlanacak, yer altına girebilecek vb.

  • Bilgi saklama: Uygulamanın Veritabanına bilgi kaydetmesini istiyoruz, ancak daha sonra bir dosyayı kaydedebilir veya web araması yapması gerekebilir

  • Çıktı: X'i düz bir dize olarak çıkarmamız gerekir, ancak daha sonra CSV, XML, JSON, vb. Olabilir.


Örnekler

Kullanıcıların bir veritabanındaki kişilere ürün atayabileceği bir projem var. Bir ürünün bu kişiye atanması, bazı iş kurallarına bağlı olarak "Onaylandı" veya "Reddedildi" olan bir duruma sahiptir. Örneğin: bir kullanıcı belirli bir yaşı belli bir kişiye bir ürün atarsa, durumunun reddedilmesi gerekir; Öğedeki iki alan arasındaki fark 50'den büyükse, durumu reddedilir vb.

Şimdi, gelişme anında bu iş kuralları henüz tamamen net değil ve herhangi bir zamanda yeni kurallar ortaya çıkabilir. Stragety modelinin gücü, bir IRule listesi verilen bir RuleAgent yapmamdır. 

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

Bir kişiye bir ürün tayin etme anında, bir RuleAgent yarattım, ona kuralların bir listesini verdim (hepsi IRule'yi uyguladı) ve ondan bir ödevi onaylamasını istiyorum. Tüm kuralları üzerinden geçecek. Bu, hepsinin aynı arayüzü kullanması nedeniyle, hepsi IsApproved yöntemine sahiptir ve herhangi biri false döndürürse false döndürür.

Mesela, menajer aniden ortaya çıkıp şunu söylediğinde, stajyerlerdeki tüm ödevleri veya fazla mesai yapan kişilere yapılan bütün ödevleri reddetmemiz gerekir ... Bunun gibi yeni sınıflar yaparsınız:

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

İf-deyimlerini veya kodlarını eklemeye veya silmeye devam etmek zorunda olmadığınızı görüyorsunuz, yalnızca IRUle arayüzünü uygulayan ve gerektiğinde bunları değiştiren yeni bir kural sınıfı oluşturun. 


Bir başka harika örnek: Scott Allen'ın http://www.asp.net/mvc/pluralsight adresindeki video dizisi -/uygulamanın Birim-test bölümünde strateji modelini kullandığı yer

Popülerliğe dayalı öğeleri görüntüleyen bir sayfa içeren bir web sitesi oluşturur. Ancak "Popüler" birçok şey olabilir (çoğu görünüm, çoğu abone, oluşturma tarihi, çoğu etkinlik, en az yorum, vb.) Ve yönetim henüz nasıl sipariş verileceğini tam olarak bilmiyorsa ve farklı denemeler yapmak isteyebilir. sonraki bir tarihte sipariş. Sipariş yöntemiyle bir arayüz (IOrderAlgorithm veya başka bir şey) yaparsınız ve bir Orderer nesnesinin siparişi IOrderAlgorithm arayüzünün somut bir uygulamasına devretmesine izin verirsiniz. Bir "CommentOrderer", "ActivityOrderer", vb. Yapabilirsiniz. Ve yeni gereksinimler ortaya çıktığında bunları değiştirin.

48
Céryl Wiltink

Çok basit birkaç örnek düşünebilirim:

  • Bir listeyi sıralamak. Strateji, listedeki iki maddeden hangisinin “İlk” olduğuna karar vermek için kullanılan karşılaştırmadır.
  • Çalışma zamanında sıralama algoritmasının kendisinin (QuickSort, HeapSort, vb.) Seçilebileceği bir uygulamanız olabilir.
  • Log4Net'te Eklentiler, Düzenler ve Filtreler ve - Log4j
  • Düzen Yöneticileri in UI araç kitleri
  • Veri sıkıştırma. Tek yöntemi şuna benzeyen bir ICompressor arabirimine sahip olabilirsiniz:

    bayt [] sıkıştır (bayt [] girişi);

    Somut sıkıştırma sınıflarınız RunLengthCompression, DeflateCompression vb. Gibi şeyler olabilir.

11
Eric Pohl

Strateji modelinin yaygın bir kullanımı, özel sıralama stratejileri tanımlamaktır (örneğin yüksek dereceli işlevleri olmayan dillerde); Java'da dizelerin listesini uzunluğa göre sıralamak, adsız bir iç sınıfı geçmek (strateji arabiriminin bir uygulaması):

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

Benzer şekilde, stratejiler, nesne veritabanlarına sahip yerel sorgular için, ör. db4o'da:

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

Her gün kullanıcı tabanını kurumsal dizinimize göre senkronize eden bir uygulamam var. Kullanıcı, Üniversitedeki statülerine göre uygun veya uygun değildir. Hergün hazırlık programı geçer ve başvuruda bulunmaları gerekenlerin başvuruda sağlandığından ve şartlarının kaldırılmadığına emin olur (aslında zarif bir bozunma algoritmasına göre, ancak bu konunun yanındadır). Cumartesi günü, her bir kullanıcının bazı özelliklerini senkronize eden ve uygun uygunluklarına sahip olduklarından emin olan daha kapsamlı bir güncelleme yapıyorum. Ayın sonunda, o ayın kullanımına bağlı olarak fatura geri işleme işlemi yapıyorum.

Bu senkronizasyonu yapmak için bir beste edilebilir strateji kalıbı kullanıyorum. Ana program temelde haftanın gününe (sadece senkronizasyon değişir/tümünü senkronize eder) ve akademik takvime göre sömestr zamanına bağlı olarak bir ana strateji seçer. Fatura döngüsü sona eriyorsa, aynı zamanda bir faturalandırma stratejisiyle de oluşturur. Daha sonra seçilen stratejiyi standart bir arayüz üzerinden çalıştırır.

Bunun ne kadar yaygın olduğunu bilmiyorum, ama strateji paternine mükemmel bir şekilde uyduğunu hissettim.

8
tvanfosson

Anahtar notlar:

  1. Strateji davranışsal tasarım desenidir. Algoritmalar ailesi arasında geçiş yapmak için kullanılır. 

  2. Bu model, bir soyut strateji arayüz ve o arayüzün birçok somut strateji uygulaması (algoritma) içerir. 

  3. Uygulama sadece arayüz stratejisini kullanır. Bazı yapılandırma parametrelerine bağlı olarak, somut strateji, arayüz olarak etiketlenecektir.

UML Diyagramı wikipedia

 enter image description here

Gerçek bir Word örneği: Havayolları birkaç ay boyunca indirim teklif ediyor (Temmuz-Aralık). Ay numarasına bağlı olarak fiyatlandırma seçeneklerine karar veren bir Ücret modülünüz olabilir. 

Basit bir örneğe bir göz atın. Bu örnek, özel günlerde/mutlu saatlerde alışveriş sepetindeki ürünlere kolayca indirim sağlayan çevrimiçi perakende satış uygulamalarına genişletilebilir. 

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

}

çıktı:

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

Yararlı makaleler:

strateji desen dzone tarafından

strateji desen sourcemaking tarafından

8
Ravindra babu

Bunun eski bir soru olduğunu biliyorum ama yakın zamanda uyguladığım ilginç başka bir örneğim olduğunu düşünüyorum.

Bu, bir belge dağıtım sisteminde kullanılan strateji modelinin çok pratik bir örneğidir.

Çok sayıda belge ve bir miktar meta veri içeren bir arşiv alan PDF teslim sistemim vardı. Meta verilere dayanarak, belgenin nereye yerleştirileceğine karar verdi; diyelim ki, verilere bağlı olarak, belgeyi A, B veya C depolama sistemlerinde veya üçünün bir karışımında saklayabilirim.

Farklı müşteriler bu sistemi kullandılar ve hata durumunda farklı geri alma/hata işleme gereksinimlerine sahip oldular: birincisi, teslim sisteminin ilk hatayı durdurmasını, tüm belgeleri önceden depolarında bırakmasını, ancak işlemi durdurmasını ve başka bir şey sunmamasını istedi ; diğeri ise B'da saklanırken hata olması durumunda C'dan geri alınmasını istedi, ancak zaten A öğesine gönderilenleri bırakın. Üçüncü veya dördüncü birinin de farklı ihtiyaçları olacağını hayal etmek kolaydır.

Sorunu çözmek için, teslimat mantığını içeren temel bir teslimat sınıfı ve ayrıca tüm depolardaki eşyaları geri alma yöntemleri oluşturdum. Bu yöntemler aslında hata durumunda doğrudan teslimat sistemi tarafından çağrılmaz. Bunun yerine, sınıf, hata durumunda çağrılan ve bu stratejiye uygunsa geri alma yöntemlerini çağıran "Geri Alma/Hata İşleme Stratejisi" sınıfını (sistemi kullanan müşteriyi temel alarak) almak için Bağımlılık Enjeksiyonunu kullanır.

Teslimat sınıfının kendisi, strateji sınıfına ne olduğunu (hangi depolara hangi dokümanların teslim edildiğini ve hangi arızaların gerçekleştiğini) bildirir ve ne zaman bir hata meydana gelirse, stratejiye devam edilip edilmeyeceğini sorar. Strateji "durdur" diyorsa, sınıf, stratejinin "geridönüş" yöntemini çağırır; bu, daha önce bildirilen bilgileri, teslim sınıfından hangi geri alma yöntemlerini arayacağına ya da hiçbir şey yapmamaya karar vermek için kullanır.

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

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

Bu yüzden şimdi iki farklı stratejim var: biri QuitterStrategy (ilk hataya son veren ve hiçbir şeyi temizlemeyen) ve diğeri MaximizeDeliveryToAStrategy (işlemden vazgeçmemek ve depoya teslim edilen şeyleri asla geri döndürmemek mümkün olduğunca çalışır) A, ancak B öğesine teslim alınmazsa, C öğesinden geri alma alır).

Anladığım kadarıyla, bu strateji modelinin bir örneğidir. Eğer (evet, okuyorsun) yanlış olduğumu düşünüyorsan, lütfen aşağıya yorum yaz ve bana bildir. Strateji modelinin "saf" kullanımını neyin teşkil edeceğini ve uygulamamın hangi yönlerinin tanımı ihlal ettiğini merak ediyorum. Bence biraz komik görünüyor çünkü strateji arayüzü biraz şişman. Şimdiye kadar gördüğüm tüm örnekler yalnızca bir yöntem kullanıyor, ancak bunun hala bir algoritmayı içerdiğini düşünüyorum (eğer bir iş mantığı parçası bir algoritma olarak düşünülebilirse, benim yaptığımı düşünüyorum).

Strateji teslimatın yürütülmesi sırasındaki olaylar hakkında da bilgilendirildiği için, aynı zamanda Gözlemci olarak da kabul edilebilir, ancak bu başka bir hikaye.

Küçük bir araştırma yapmaktan anlaşılıyor ki, bu, "{kompozit patern" "(MVC gibi, belirli bir şekilde birden fazla tasarım paterni kullanan bir patern), Danışman olarak adlandırılıyor. Teslimatın devam edip etmemesi konusunda bir danışmandır, ancak istendiğinde işleri geri alabilmesi nedeniyle aktif bir hata işleyicisidir.

Her neyse, bu, strateji modelinin kullanımının tamamen basit/saçma olduğunu hissetmenize neden olabilecek oldukça karmaşık bir örnektir. Diğer desenlerle birlikte kullanıldığında gerçekten karmaşık ve daha da uygulanabilir.

7

Strateji kalıbı, özellikle doğrulama ve sıralama algoritmaları için kullanılan kalıptır. 

Basit bir pratik örnekle açıklayayım 

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

}  

Bunun için test kodu

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

}

Aynı örnek http://coder2design.com/strategy-pattern/ adresinden alınmıştır.

6
Jatinder Pal

Strateji desenine güzel bir örnek, farklı karakterlere sahip olabileceğimiz ve her karakterin saldırmak için birden fazla silah alabileceği bir oyunda olabilir, ancak bir seferde sadece bir silah kullanabilir. Dolayısıyla bağlam olarak karakterimiz var, örneğin Kral, Komutan, Şövalye, Asker ve saldırının () kullanılan silahlara bağlı olan yöntem/algoritma olabileceği bir strateji olarak silah. Yani somut silah sınıfları Kılıç, Balta, Tatar Yayı, BowAndArrow vs. olsaydı, hepsi attack () yöntemini uygulardı. Daha fazla açıklamaya gerek olmadığından eminim.

4

Bir "düzen" in durumunun bir Devlet düzeni olmadığından emin misiniz? Durumuna bağlı olarak bir siparişin farklı şekilde ele alınmayacağına dair bir ipucum var.

Örneğin, Siparişte Gönder yöntemini alın

order.Ship();
  • Gönderim yöntemi durumunun işlevine göre değişirse, o zaman bir strateji modeliniz vardır.
  • Bununla birlikte, Ship () yöntemi yalnızca sipariş ödendiğinde ve sipariş henüz gönderilmediğinde başarılı olursa, bir durum modeli elde etmiş olursunuz. .

Buldum durum modelinin (ve diğer modellerin) en iyi örneği, şaşırtıcı olan " Birinci Tasarım Desenlerinin Başını " kitabındaydı. Yakından bir saniye David Cumps'in bloglama dizileri dizisi olacak.

2
grootjans

Diyelim ki, belirli bir ayın ve yılın nt Xday değerini hesaplamak için bir algoritma yazmak istediğinizi varsayalım, örneğin Ekim 2014’ün ikinci Pazartesi günü. Temsil etmek için Android’in Zaman sınıfını Android.text.format.Time kullanmak istiyorsunuz tarih, ancak aynı zamanda Java.util.Calendar için de geçerli olabilecek genel bir algoritma yazmak istersiniz.

Ben de öyle yaptım.

DatetimeMath.Java'da:

public interface DatetimeMath { 
    public Object createDatetime(int year, int month, int day);

    public int getDayOfWeek(Object datetime);

    public void increment(Object datetime);
}

TimeMath.Java'da:

public class TimeMath implements DatetimeMath {
    @Override
    public Object createDatetime(int year, int month, int day) {
        Time t = new Time();
        t.set(day, month, year);
        t.normalize(false);
        return t;
    }

    @Override
    public int getDayOfWeek(Object o) {
        Time t = (Time)o;
        return t.weekDay;
    }   

    @Override
    public void increment(Object o) {
        Time t = (Time)o;
        t.set(t.monthDay + 1, t.month, t.year);
        t.normalize(false);
    }
}

OrdinalDayOfWeekCalculator.Java'da, genel algoritma içeren sınıf:

public class OrdinalDayOfWeekCalculator {   
    private DatetimeMath datetimeMath;

    public OrdinalDayOfWeekCalculator(DatetimeMath m) {
        datetimeMath = m;
    }

    public Object getDate(int year, int month, int dayOfWeek, int ordinal) {
        Object datetime = datetimeMath.createDatetime(year, month, 1);
        if (datetimeMath.getDayOfWeek(datetime) == dayOfWeek) {
            return datetime;
        } 
        int xDayCount = 0;
        while (xDayCount != ordinal) {
            datetimeMath.increment(datetime);
            if (datetimeMath.getDayOfWeek(datetime) == dayOfWeek) {
                xDayCount++;
            }
        }
        return datetime;
    }
}

Android uygulamamda şöyle bir şey arardım:

OrdinalDayOfWeekCalculator odowc = 
        new OrdinalDayOfWeekCalculator(new TimeMath());
Time canadianThanksgiving = (Time)odowc.getDate(
        year, Calendar.OCTOBER, Time.MONDAY, 2);

Aynı algoritmayı Java.util.Calendar için tekrar kullanmak istersem, DatetimeMath'ta üç yöntemi uygulayan bir CalendarMath sınıfı yazıp kullanacağım.

OrdinalDayOfWeekCalculator odowc2 = 
        new OrdinalDayOfWeekCalculator(new CalendarMath());
Calendar canadianThanksgivingCal = (Calendar)odowc2.getDate(
        year, Calendar.OCTOBER, Calendar.MONDAY, 2);
2
anomal

Çok karmaşık bir veritabanına sahip bir kurumsal platform için üçüncü taraf bir ön hazırlık arayüzü oluşturmak zorunda kaldık. Sağlanacak verilerin teslimi, başvurumuzda öncelik sırasına konan veri tiplerimizin bir listesi olup, bağımlılıklar nedeniyle veritabanına doğru sırada yazılabilmelerini sağlamıştır.

Bu verileri yazma işlemi daha sonra oldukça basitti, öncelik sırasının en üstünde yer almaya devam edin ve sonra çıkardığınız nesnenin türüne göre bir strateji seçin.

1
Coxy

Birkaç hafta önce, etki alanı nesnelerimizden birinin uyguladığı ortak bir Java arayüzü ekledim. Bu etki alanı nesnesi veritabanından yüklendi ve veritabanı gösterimi yaklaşık 10+ dallı bir yıldız şemasıydı. Bu kadar ağır bir etki alanı nesnesine sahip olmanın sonuçlarından biri, daha az ağır olsa da aynı şemayı temsil eden diğer etki alanı nesnelerini yapmak zorunda kalmamızdır. Bu yüzden diğer hafif objelerin de aynı arayüzü kullanmasını sağladım. Aksi takdirde, biz vardı:

public interface CollectibleElephant { 
    long getId();
    String getName();
    long getTagId();
}

public class Elephant implements CollectibleElephant { ... }
public class BabyElephant implements CollectibleElephant { ... }

Aslında, CollectibleElephants dizilimini yapmak için Elephant kullanmak istedim. Çok hızlı bir şekilde, ekip arkadaşlarım güvenlik kontrolleri yapmak, GUI'ye gönderilenler gibi filtrelemek için CollectibleElephant 'a bağlandı.

1
Alan
public class StrategyDemo {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();

        Item item1 = new Item("1234", 10);
        Item item2 = new Item("5678", 40);

        cart.addItem(item1);
        cart.addItem(item2);

        // pay by Paypal
        cart.pay(new PaypalStrategy("[email protected]", "mypwd"));

        // pay by credit card
        cart.pay(new CreditCardStrategy("Pankaj Kumar", "1234567890123456", "786", "12/15"));
    }
}

interface PaymentStrategy {
    public void pay(int amount);
}

class CreditCardStrategy implements PaymentStrategy {

    private String name;
    private String cardNumber;
    private String cvv;
    private String dateOfExpiry;

    public CreditCardStrategy(String nm, String ccNum, String cvv, String expiryDate) {
        this.name = nm;
        this.cardNumber = ccNum;
        this.cvv = cvv;
        this.dateOfExpiry = expiryDate;
    }

    @Override
    public void pay(int amount) {
        System.out.println(amount + " paid with credit/debit card");
    }

}

class PaypalStrategy implements PaymentStrategy {

    private String emailId;
    private String password;

    public PaypalStrategy(String email, String pwd) {
        this.emailId = email;
        this.password = pwd;
    }

    @Override
    public void pay(int amount) {
        System.out.println(amount + " paid using Paypal.");
    }

}

class Item {

    private String upcCode;
    private int price;

    public Item(String upc, int cost) {
        this.upcCode = upc;
        this.price = cost;
    }

    public String getUpcCode() {
        return upcCode;
    }

    public int getPrice() {
        return price;
    }

}

class ShoppingCart {

    // List of items
    List<Item> items;

    public ShoppingCart() {
        this.items = new ArrayList<Item>();
    }

    public void addItem(Item item) {
        this.items.add(item);
    }

    public void removeItem(Item item) {
        this.items.remove(item);
    }

    public int calculateTotal() {
        int sum = 0;
        for (Item item : items) {
            sum += item.getPrice();
        }
        return sum;
    }

    public void pay(PaymentStrategy paymentMethod) {
        int amount = calculateTotal();
        paymentMethod.pay(amount);
    }
}
1
Vivek Goel

Strateji yaklaşımını oldukça karmaşık bir motorda iyi bir örnek olan bir uygulamada kullandım. Temel olarak motorun rolü gidip önce bir widget'ı olan kişilerin bir listesini bulmaktı, ikinci rolü ise bilinmeyen sayıda parametreye dayanan bir widget'a sahip en iyi 10 kişinin hangileri olduğunu bulmaktı. , stoktaki miktar, nakliye seçenekleri vb vb ...)

Temelde yaptığımız şey, problemi ilk önce veri alma olan iki stratejiye ayırdık, çünkü birden fazla widget kaynağımız olduğunu biliyorduk ve verileri alabilmemiz ve ortak bir yapıya dönüştürmemiz gerekiyordu.

Daha sonra bazı parametrelerin ağırlıklandırmaya dayandığını, diğerlerinin çok garip ve elverişli olduğunu ve çok fazla algoritmaya sahip olmadığımızı fark ettik. en iyi insanları seçmek. 

Servisimizin kendisi esasen girdileri, çıktıları tanımlayan ve verilerin bir miktar normalleştirmesini yapan şeydi, aynı zamanda uygulamaya özgü veri sağlayıcıları ve stratejiyi kullanan algoritim sağlayıcılarını eklemek için bir sağlayıcı modeli kullandı. Bu oldukça etkili bir sistemdi.

Asla çözemediğimiz bir strateji veya şablon paterni kullanıyorsak bazı tartışmalar yaptık.

1
JoshBerke

Wikipedia'dan 

Bilgisayar programlamasında, strateji kalıbı (politika kalıbı olarak da bilinir) çalışma zamanında bir algoritma seçmeyi sağlayan davranışsal bir yazılım tasarım kalıbıdır. Doğrudan tek bir algoritma uygulamak yerine, kod hangi algoritmalar ailesinde kullanılacağına ilişkin çalışma zamanı talimatları alır.

Windows Paint uygulamasında, şekli ve rengi bağımsız olarak farklı bölümlerde seçebileceğiniz bir strateji deseni görebilirsiniz. Burada şekil ve renk, çalışma zamanında değiştirilebilecek algoritmalardır. 

Eğer 'RedCircle' seçeneği sunmak yerine kırmızı renkli bir daire çizmek istiyorsanız, seçtiğiniz daireyi ve rengi seçmenize izin verir.

Shape redCircle = new RedCircle(); // Without stretegy Pattern
Shaped redCircle = new Shape("red","circle"); // With Strategy pattern

Strateji olmadan desen kartezyen şekli ve renk ürünü ile sınıf sayısını artıracak. Ayrıca her uygulama için arayüz değişmektedir.

0
bharanitharan