1
我有一個用例,我需要做條件日誌記錄,所以這意味着什麼可以說我有方法樹皮()這將接受動物,如果我通過狗它應該記錄像狗在吠叫。所以根據對象的類型日誌語句會改變。有一件事可以做,就是檢查對象的類型,並根據它來做日誌記錄,但這可能不是一種非常有效的方法。所以在任何情況下,這個用例都可以用裝飾器模式來解決,還是有更好的解決方法。用裝飾器模式的條件日誌記錄
我有一個用例,我需要做條件日誌記錄,所以這意味着什麼可以說我有方法樹皮()這將接受動物,如果我通過狗它應該記錄像狗在吠叫。所以根據對象的類型日誌語句會改變。有一件事可以做,就是檢查對象的類型,並根據它來做日誌記錄,但這可能不是一種非常有效的方法。所以在任何情況下,這個用例都可以用裝飾器模式來解決,還是有更好的解決方法。用裝飾器模式的條件日誌記錄
老實說,我發現它頗具意見基礎,我不認爲我想創建一個類來包裝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();
}
您的整體造型非常糟糕。只有狗叫,所以'樹皮'應該是'狗'的一種方法。即使它是一個更通用的方法,比如'makeSound',它應該成爲'Animal'的一個方法。 「樹皮(狗)」或「makeSound(狗)」是沒有意義的。它應該是'dog.makeSound()'。並且它應該被覆蓋在'Dog.class'內部,然後它可以記錄它自己的日誌語句。 – MarcG