0

我有一个delete(object)方法应该根据要删除的对象执行不同的代码。

class MyService {

   void delete(Object obj) {
     if (obj instanceof Foo) {
         //execute some foo deletion logic
     } 
     if (obj instanceof Bar) {
         //execute some bar deletion logic
     }
     //if... and so on
   }
}

从设计的角度来看,我怎样才能避免instanceof这里的检查?我不能delete()在我的所有实现中引入一个方法,因为对象不应该知道它们应该如何删除自己。

那里还有什么?

4

3 回答 3

5

您仍然可以通过编写来使用子类化机制(甚至可以使其通用)

class MyService<T> {
   void delete(T obj) {
     // Only the delete logic, but nothing specific for any type
   }
}

然后,对于 Foo,您将创建一个子类:

class MyFooService extends MyService<Foo> {
    void delete(Foo obj) {
        //execute some foo deletion logic
        // finally, invoke super class as it knows how to do the real delete action
        super.delete(obj);
    }
}

这样,您的Foo特定逻辑位于 中MyFooService,并且您的Foo逻辑被放入单独的类中。作为额外的奖励,这为您提供了可以进行良好单元测试的类。

于 2013-03-31T16:54:26.570 回答
2

方法重载:

void delete(Foo f) {}
void delete(Bar b) {}
于 2013-03-31T16:51:09.270 回答
0

IMO最好创建一个代表DeleteType的枚举说

public enum DeleteType {

Foo, Bar  //..... }

并且在MyServicedelete 方法中可以采用 2 个参数,例如,

void delete(DeleteType type, Object object) {
switch(type) {
case Foo:
 //Deletion of Foo objects....
 break;
case Bar:
//Deletion of Bar objects....
 break;
 ....
}
}

如果您希望delete方法签名完好无损,则type可以将其存储在其obj自身中(通过使obj' 的类遵守interface将使其成为return的contract( ) type

于 2013-03-31T16:58:03.697 回答