我有一个基本的处理界面:
public interface Processing<T> {
void appendTo(T t);
}
还有这个继承树:
public class Animal {
}
public class Dog extends Animal {
public void forDog() {}
}
public class Cat extends Animal {
public forCat() {}
}
这是关于动物加工的。我有两个解决方案。哪一种是最好的图案?
解决方案 A(使用仿制药):
public abstract class AbstractProcessing<T extends Animal> implements Processing<T> {
protected void internalAppend() {}
}
public class CatProcssing extends AbstractProcessing<Cat>{
@Override
public void appendTo(Cat cat) {
cat.forCat();
internalAppend();
}
}
public class DogProcessing extends AbstractProcessing<Dog>{
@Override
public void appendTo(Dog dog) {
dog.forDog();
internalAppend();
}
}
解决方案B:
public class AnimalProcessing implements Processing<Animal>{
@Override
public void appendTo(Animal animal) {
if (animal instanceof Cat cat) {
cat.forCat();
} else if (animal instanceof Dog dog) {
dog.forDog();
} else {
throw new IllegalArgumentException();
}
internalAppend();
}
private void internalAppend() { }
}
类型检查是一种代码味道,因为它打破了开闭原则。因此不推荐第二种解决方案。
在第一个解决方案中,为什么需要“internalAppend”?应该避免它,因为它不会向设计添加任何内容,“appendTo”方法就足够了。