我有一个用例,我需要进行条件loglog,所以这意味着我可以说我接受Animal的方法bark(),如果我通过狗它应该记录像狗在吠叫的东西。因此,基于对象类型,日志语句将发生变化。可以做的一件事是检查对象的类型,并根据它进行日志记录,但这可能不是一种非常有效的方法。因此,无论如何,这个用例都可以通过装饰器模式解决,或者有更好的解决方法。
答案 0 :(得分:0)
老实说,我发现它基于意见,我认为我不想创建一个包围Animal
对象的类。
但是当我已经编写了大部分代码时,我发现装饰器模式很有用,突然你觉得你应该做一些额外的事情。所以这里的重构变成了繁琐的工作。我发现这种情况最适合装饰模式。
从你的问题:
我有一个用例,我需要进行条件loglog,那是什么 这意味着可以说我有方法bark(),它会接受Animal
我会采用与你相同的方法,但方式略有不同......
您可以创建名为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!");
}
}
如果您不选择SpeakingAnimal
延长Animal
,则可以:
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();
}