带有装饰器模式的java条件记录

时间:2016-11-22 11:24:19

标签: java design-patterns

我有一个用例,我需要进行条件loglog,所以这意味着我可以说我接受Animal的方法bark(),如果我通过狗它应该记录像狗在吠叫的东西。因此,基于对象类型,日志语句将发生变化。可以做的一件事是检查对象的类型,并根据它进行日志记录,但这可能不是一种非常有效的方法。因此,无论如何,这个用例都可以通过装饰器模式解决,或者有更好的解决方法。

1 个答案:

答案 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();
}