2016-03-30 37 views
2

Klasik kahve dekoratör örneği (Wikipedia'dan kopyalanan) verildi. Ortak üyeler dekoratörlerdeki değişkenleri nereye koyacağız

public interface Coffee { 
    public double getCost(); 
} 

public class SimpleCoffee implements Coffee { 
    public double getCost() { 
     return 1; 
    } 
} 

public abstract class CoffeeDecorator implements Coffee { 
    protected final Coffee decoratedCoffee; 
    public CoffeeDecorator(Coffee c) { 
     this.decoratedCoffee = c; 
    } 
    public double getCost() { 
     return decoratedCoffee.getCost(); 
    } 
} 

class WithMilk extends CoffeeDecorator { 
    public WithMilk(Coffee c) { 
     super(c); 
    } 
    public double getCost() { 
     return super.getCost() + 0.5; 
    } 
} 

Şimdi bütün dekoratörler (örneğin süt) fiyatı tüm kahveler var (kahve boyutunu söylemek) olacağı bazı özelliğe bağlıdır ve kahve boyutu başka yerde kullanılan ASLA olduğunu varsayalım. Sınıf hiyerarşisine kahve boyutunu nereye eklemeliyiz? o korunan ayarlanmış ise

Ben Kahve Arabirimi

public interface Coffee { 
    public double getCost(); // Returns the cost of the coffee 
    public/protected double size; 
} 

koyabilirsiniz bunun herkese açık olarak ayarlanmış ise, boyut gereksiz yere

maruz, dekoratörler gerçekten (decoratedCoffee aracılığıyla erişemez Ben CoffeeDecorator koyabilirsiniz

Bu yayını Java: cannot access a protected member of the superclass in the extending subclass ve Why can't a derived class call protected member function in this code?) bakın ama sonra

için yapıcı değiştirmek zorunda kalacak Bir şekilde en şık çözüm gibi görünmüyor
public CoffeeDecorator(Coffee c) { 
    if c is of type CoffeeDecorator 
     size = c.size; 
    this.decoratedCoffee = c; 
} 

...

ben koyabilirsiniz (ben boş olmayan boyutu ile bulana kadar Açıkçası decoratedCoffee s zinciri boyunca kazma ya bir seçenek değildir) Her bir dekoratörde sadece tasarım ilkelerine aykırı.

Bu senaryonun sık sık ortaya çıktığına eminim, böyle bir davayı ele almanın en iyi yolunun ne olduğunu bilmek isterim?

Şimdiden teşekkürler.

--- Düzenleme 31/3/2016 ---

belli nitelik (şimdi kahve boyutuna değiştirildi önceden fincan boyutu,) tüm kahveler gereken bir şey olduğunu netleştirin.

cevap

0

Bu sınıflardan herhangi birine Cup boyutunu eklemenin iyi bir fikir olduğunu sanmıyorum. Sadece oraya sığmıyor çünkü kahve bardaklar hakkında hiçbir şey bilmiyor.

public class Cup { 
    private Coffee coffee; 

    public Cup(Coffee c) { 
     this.coffee = c; 
    } 

    public getCost() { 
     return this.getSize() * c.getCost(); 
    } 

    public getSize() { 
     return 1; // standard cup 
    } 
} 

public class BigCup extends Cup { 

    public getSize() { 
     return 2; // double size 
    } 

} 

Yani şimdi new BigCup(new WithMilk(new Coffee())) yapabilirsiniz:

Cup

(java sözdizimi ile çok aşina değilim, sözde kodu olarak theat kodu) ayrı bir sınıf olabilir.

public class Cup extends CoffeeDecorator { 

    public Cup(Coffee c) { 
     super(c); 
    } 

    public getCost() { 
     return this.getSize() * super.getCost(); 
    } 

    public getSize() { 
     return 1; // standard cup 
    } 
} 

public class BigCup extends Cup { 

    public getSize() { 
     return 2; // double size 
    } 

} 
+0

Belki kahve: Alternatif Cup ayrıca programlama açısından mantıklı ama gerçek hayatta açısından belki biraz daha az duyu (şimdi Kupa da kahve uygulayan çünkü, eğlenceli sesler), bir dekoratör olabilirler boyutu daha iyi bir terim olurdu, anahtar dekoratörler tüm kahvelerde mevcut olan "bazı özellik" e bağlı olduğu, ben hala açık değil – Woofas

+0

@Woofas açıklığa kavuşacağım, "kahve boyutu" ne anlama geliyor? Ve dekoratörler buna tam olarak nasıl bağlı? Ve niçin 'getCost() '(bazı' getSize()' yöntemi) ile aynı şekilde ekleyemiyorsunuz, ya da daha da iyisi, bu özniteliği hiç açığa çıkarmıyor ve anlatmıyorsunuz. http://martinfowler.com/bliki/TellDontAsk.html)) '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'depending depending depending depending depending something something depending depending depending something something something depending depending something something something something something something something something something to???????????????????????????????????????????? Coffee Coffee Coffee Genel olarak 'kahve büyüklüğü' ile ilgili örnek hala gerçekçi görünmüyor, bu yüzden sorunun tam olarak ne olduğu açık değil. –