Ich habe verschiedene Klassenarten, und abhängig von einigen Bedingungen möchte ich an die entsprechenden service
delegieren, die diese Klassenarten behandeln können. Beispiel: Ich habe mehrere Klassen wie folgt.Wie an Dienste nach Klassenart delegieren?
class Student;
class Prof;
...
Für jede Klasse gibt es einen Service, Implementierung:
interface IPersonService {
void run();
}
Und ich habe eine mode
, die von einigen Bedingungen zu finden ist:
enum PersonType {
STUDENT, PROF;
}
Wenn ich delegieren:
@Autowired
private StudentService studentService;
@Autowired
private ProfService profService;
//@param mode assume known
public void delegate(PersonType mode) {
//assume there are several of those switch statements in my business code
switch (mode) {
case STUDENT: studentService.run(); break;
case PROF: profService.run(); break;
default: break;
}
}
Problem: Wenn ich zusätzliche Klassen einzuführen, muss ich sowohl die PersonType
ändern und eine zusätzliche enum hinzufügen (was kein Problem ist), aber ich muss auch alle switch
Anweisung zu erweitern und Anrufe zu zusätzlichen Delegationsdienste hinzufügen. Außerdem muss ich diese Dienste explizit dem Switch Delegator zuweisen.
Frage: Wie könnte ich diesen Code optimieren, nur neue Services für jede zusätzliche Klasse implementieren und keine der Switch-Anweisungen berühren müssen?
Sie eine Zuordnung in Enum halten sich person mit dem Service und in Delegierter zu assoziieren nur den Dienst auf person erhalten basierend & es nennen. – Sanjeev
Aber ich kann die Dienste nicht in die Enum injizieren, kann ich? – membersound
Die Ursache des Problems liegt darin, dass die Servicelogik von den Daten getrennt ist, die sie bedient. Die Trennung von Daten und Logik heißt [Procedural Programming] (https://en.wikipedia.org/wiki/Procedural_programming). In [Objektorientierte Programmierung] (https://en.wikipedia.org/wiki/Objektorientierte_Programmierung) wird die Servicelogik mit den von ihr bereitgestellten Daten kombiniert, so dass keine Delegierung erforderlich ist. – jaco0646