作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个名为“animal”的包,其中包括 Animal 父类,Cat 继承自 Animal,Dog 也继承自 Animal。然而,Animal 的设计是这样的:
class Animal {
int amount;
Animal next; // Then a constructor initializes these.
drinkWater(int n) { ... }
}
猫和狗类遵循以下结构:
class Cat extends Animal {
Cat(int amount, Animal next) {
super(amount, next);
}
@Override
drinkWater(int n) { .. }
}
它们每个都有方法,drinkWater(),如下所示:
public void drinkWwater(int n) {
amount -= n;
if (amount < 0) amount = 0;
if (next != null) next.drinkWater(n);
}
我现在想做的是创建一个动物的“链接列表”,每个动物都按顺序喝水。但是,假设一只猫喝了 n 份水,它会将 n+1 份水传递给它的下一个
我的目的是找到一种解决方案来克服“不接触原始动物包装,但改变每只动物的饮水行为”的问题。我已经用一个类提供了那个“著名的”天真的解决方案:
class InvokeStaticTypeBDrink {
static void typeBdrink(Animal animal, int n) {
animal.amount -= n;
if (animal.amount < 0) animal.amount = 0;
if (animal.next != null) {
if (animal instanceof Cat)
InvokeStaticTypeDrink.drinkWater(animal.next, n+1);
else if (animal instanceof Dog)
InvokeStaticTypeDrink.drinkWater(animal.next, n-1);
else
InvokeStaticTypeDrink.drinkWater(animal.next, n);
}
}
}
然后,我开始研究。因为这确实看起来又快又脏的解决方案。
所以,我发现了一种称为“访问者模式”的设计模式。嗯,这是一个很酷的模式,它解决了双重调度的问题,但我这边有一个问题:Visible 接口(interface)(声明accept() 方法)应该由原始的 Animals '实现'。然而,我的目标是“不要对原始动物包装进行任何修改,但要改变饮用水行为”。我很确定我错过了一些东西。
那么,您认为稍微修改一下,访问者模式仍然有效,还是其他模式/解决方案会更好?谢谢。
最佳答案
如果您不想触及原始类,那么应用访问者模式的唯一方法是将原始类包装在新的(包装器)类中。
无论如何,如果您只是想改变某些动物的行为,那么在您的情况下,我只会扩展这些特定类别并覆盖饮酒行为。 p>
那么你就会有一只这样的猫:
class NonThirstyCat extends Cat {
Cat(int amount, Animal next) {
super(amount, next);
}
@Override
public void drinkWater(int n) {
amount += n;
if (amount < 0) amount = 0;
if (next != null) next.drinkWater(n);
}
}
关于java - 如何修改包外预定义的包方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3793462/
我是一名优秀的程序员,十分优秀!