2009-06-08 7 views
9

Genel Strateji Örüntüsünde, her stratejiyi bir sınıf olarak yaparız. Bir işlevi yapamayız ve bir nesneyi başlattığımızda sadece referansı atayıp nesnenin bu işlevi çağırmasına izin veremez miyiz?Strateji Örüntüsünde, her stratejiyi bir işlev olarak değil, sınıf olarak yapamayız mı?

+0

Bu durumda Java ile eğlenin :) – Joey

+1

neden? Java işlevi referansı destekleyemez mi? Tasarım Kalıpları hakkında eleştirel düşünmek için –

+7

+1. Birçok tasarım deseninin, dilin yetersizliğinin kökünden kaynaklandığını söyleyebilirim. Pek çok durumda, tasarım desenleri biblo değildir :) – kizzx2

cevap

3

En basit durumlarda, Strateji şablonlarını bir işlev işaretçisi ile değiştirebilirsiniz. biz sadece basit bir fonksiyon işaretçisi verdiyse Ancak, bu durumda

class HourlyPayStrategy implements PayStrategy 
{ 
    public int calculate() 
    { 
     int x = doComplexOperation1(); 
     int y = doComplexOperation2(); 

     return x + y; 
    } 

    private int doComplexOperation1() 
    { 
     // ... 
    } 

    private int doComplexOperation2() 
    { 
     // ... 
    } 
} 

düşünün artık (en azından bir iyi kapsüllü bir şekilde, iyi) o şeyi planı ayrı çünkü şeyler gerçekten kıllı başlıyorsun.

+0

Buna katılmıyorum. SaatlikPayStrategy veya HourlyPayStrategy.calculate referansı, refactoring veya encapsulation anlamında bir fark yaratmaz. –

+0

@DavidArno, yazıcınız tarafından _eta genişlemesini gerçekleştiren iyi bir iş olan C# ile tanıştığınıza inanıyorum. Bu yazının pek çok dilde yapılması kolay değildir: JavaScript, Ruby, Python, Java, OCaml (birkaç yıllık bellekten) bile, C++ (sorular: C++ 11 bu günlerde nasıl oluyor?). – kizzx2

+0

Birçok dilde _function_ parametresi bekleniyorsa, derleyicinin/çalışma zamanının ilişkili nesne ile birlikte hareket etmesi gereken bir _method_ beklemekten oldukça farklıdır. Öyleyse evet, C# için argümanınızın bacakları vardır. – kizzx2

4

Dile bağlıdır. C# 'da bir delege yapabilirsin. Java'da, anonim bir sınıf olur. C++ 'da, gerçekten bir fonksiyon gösterici yapabilirdiniz.

2

Elbette, nesneleri kullanarak, sadece işlevlerle yapamadığınız şekillerde mirastan faydalanabilirsiniz.

1

C# içinde strateji modelini kullanarak delegeleri kullanabilirsiniz. Örnek olarak bu blog post'a bir göz atın.

1

Çoğu C++ uygulamasında kapağın altında ne olduğu neredeyse önerdiğiniz şeydir. derleyici genellikle (sözde kod) böyle bir çağrı Strategy.virtualMethod() giderir: Seni ilgilendiren tek bir işaretçi (pVtable) gerçekten ilk profile gerektiğini bir daha dereferencing ise

 
    (Strategy.pVtable[indexOfVirtualMethod])() 

Yani bunu yapamıyorsanız daha ciddi sıcak noktaları tanımlayın.

Duygularım, bir strateji nesnesi yerine bir işlev işaretçisi kullandığınızda kodunuzun anlaşılması ve bakımı çok daha zor olacaktır.

İlgili konular