目前我有这样的代码:
for (each item) {
if (item == 'x') {
print
}
if (item == 'y) {
print
}
}
现在,我还有一个额外的要求 - 我想要相同的检查但不是打印,而是需要在DB中插入。
即
for (each item) {
if (item == 'x') {
insertDB
}
if (item == 'y) {
insertDB
}
}
这有重复的代码,因此标志出现在我的想法中。
for (each item) {
if (item == 'x') {
if (insertDB) {
insertDB
} else {
print
}
}
if (item == 'y) {
if (insertDB) {
insertDB
} else {
print
}
}
}
这显然造成了很多if-else的混乱。我的面向对象编程告诉我一个新想法。
for (each item) {
if (item == 'x') {
obj.doItemXAction();
}
if (item == 'y) {
obj.doItemXAction();
}
}
Object obj = new PrintObj();
Object obj = new DBInsertObj();
代码看起来更干净。但是,考虑到我能想到的,有人能指出我在这种情况下处理的确切设计模式吗?
答案 0 :(得分:1)
你可以做很多种方法。这实际上取决于您希望如何组织代码。有不止一种好方法。如果我给你模糊的简短回答,“抽象”,“多态性”,“关注点分离”等等。这是一个例子,如果需要/ else则不需要:
interface AnimalBehavior {
void eat();
void drink();
}
abstract class Animal implements AnimalBehavior {
abstract void eat();
abstract void drink();
}
class Bear extends Animal {
void eat() {
// bear eats cookies
}
void drink() {
// bear drinks juice
}
}
class Chicken extends Animal {
void eat() {
// chicken eats candy
}
void drink() {
// chicken drinks soda
}
}
class AnimalStats {
main () {
Animal chicken1 = new Chicken();
Animal chicken2 = new Chicken();
Animal bear1 = new Bear();
Animal bear2 = new Bear();
List<Animal> animals = Arrays.asList(chicken1, chicken2, bear1, bear2);
for(Animal animal: animals) {
animal.eat();
animal.drink();
}
}
}
答案 1 :(得分:1)
一个更简单的多态性示例:
public interface Actionable {
void doItemAction();
}
public class Item implements Actionable {
@Override
public void doItemAction() {
// insert or print
}
}
public static void main(Actionable... args) {
for (Actionable item : args) {
item.doItemAction();
}
}
您可以更进一步,使用Actionable
和Insertable
扩展Printable
。