2016-11-22 38 views
1

我有一個用例,我需要做條件日誌記錄,所以這意味着什麼可以說我有方法樹皮()這將接受動物,如果我通過狗它應該記錄像狗在吠叫。所以根據對象的類型日誌語句會改變。有一件事可以做,就是檢查對象的類型,並根據它來做日誌記錄,但這可能不是一種非常有效的方法。所以在任何情況下,這個用例都可以用裝飾器模式來解決,還是有更好的解決方法。用裝飾器模式的條件日誌記錄

+1

您的整體造型非常糟糕。只有狗叫,所以'樹皮'應該是'狗'的一種方法。即使它是一個更通用的方法,比如'makeSound',它應該成爲'Animal'的一個方法。 「樹皮(狗)」或「makeSound(狗)」是沒有意義的。它應該是'dog.makeSound()'。並且它應該被覆蓋在'Dog.class'內部,然後它可以記錄它自己的日誌語句。 – MarcG

回答

0

老實說,我發現它頗具意見基礎,我不認爲我想創建一個類來包裝Animal對象。

但是,我發現裝飾模式很有用,當你已經寫了大部分的代碼,並突然覺得你應該做一些額外的事情。所以在這裏重構成爲一項乏味的工作。我發現這些情況最適合裝飾者模式。

從你的問題:

我有,我需要做的條件loggging的使用情況,還等什麼 也就意味着可以說我有這將接受動物法樹皮()

我會用你一起去,同樣的方法,但在一個稍微不同的方式...


您可以創建一個跨面對命名SpeakingAnimal和玩它:

public interface SpeakingAnimal extends Animal { 
    public void saySomething(); 
} 

public class Doge implements SpeakingAnimal { 
    public void saySomething() { 
     System.out.println("So Java! Very Technic! Wow!"); 
    } 
} 

如果你不選擇與Animal延長SpeakingAnimal,您可以:

public interface SpeakingAnimal { 
    public void saySomething(); 
} 

public class Dog implements Animal, SpeakingAnimal { 
    public void saySomething() { 
     System.out.println("Doggy woof woof"); 
    } 
} 

所以,你可以在你的bark()方法做到這一點:

public void bark(Animal animal) { 
    if (animal instanceof SpeakingAnimal) 
     ((SpeakingAnimal) animal).saySomething(); 
}