До копирования и после ..
Возможно, это решение не то, чего хочет ваш профессор.В этом сценарии можно использовать несколько других решений.
В следующем решении Я предполагаю, что вы можете использовать только 2 класса!
Возможное решение
Ваше Person
должно иметь поле типаMaritalState
.Это MaritalState
отслеживает состояние Person
, поэтому ему не нужно делать это самостоятельно.
Ниже просто быстрая и грязная , и она должна показать вамидея агрегации.
Person
Person
теперь делегирует всю логику, которая зависит от MaritalState
до MatrialState
public class Person {
MaritalState maritalState;
Person mate;
String name;
Person(String name1) {
maritalState = new MaritalState();
mate = null;
name = name1;
}
void GetMarried(Person mate) {
maritalState.marry(this, mate);
}
void GetDivorced(Person mate) {
maritalState.divorce(this, mate);
}
void Died() {
maritalState.die(this);
}
void PrintMaritalStatus() {
System.out.println(this.name + " maritalState status is " + this.maritalState.get());
}
public boolean isMarried() {
return maritalState.isMarried(maritalState);
}
public boolean isSingle() {
return maritalState.isSingle(maritalState);
}
public boolean isWidow() {
return maritalState.isWidow(maritalState);
}
}
MaritalState
Логика, которая была в Person
, теперь находится в состоянии Martiral
.Я расширяю некоторые функции, такие как isSingle()
, чтобы сделать код более читабельным.
public class MaritalState {
private static final String MARRIED = "married";
private static final String SINGLE = "single";
private static final String WIDOW = "widow";
private String state;
private MaritalState(String state) {
this.state = state;
}
public MaritalState() {
this.state = "single";
}
void marry(Person person, Person mate) {
if (person.isMarried() || mate.isMarried()) {
System.out.println("MaritalState status error! At least one of you are married");
} else {
person.maritalState = new MaritalState(MARRIED);
person.mate = mate;
mate.maritalState = new MaritalState(MARRIED);
mate.mate = person;
System.out.println("Congratulations!!! " + person.name + " and " + mate.name + " are married!");
}
}
void divorce(Person person, Person mate) {
if (person.isMarried() && person.mate == mate) {
person.maritalState = new MaritalState("divorced");
System.out.println(person.name + " and " + mate.name + " are getting divorced.");
} else if (person.isSingle()) {
System.out.println("You are not married and you cannot get divorced before getting married");
} else if (person.isWidow()) {
System.out.println("Your maritalState status is widow, you cannot get divorced.");
}
}
void die(Person person) {
person.maritalState = new MaritalState("dead");
person.mate.maritalState = new MaritalState("widow");
System.out.println("Sorry for your loss, " + person.mate.name + " maritalState status is widow.");
}
public boolean isMarried(MaritalState maritalState) {
return maritalState.state.equals(MARRIED);
}
public boolean isSingle(MaritalState maritalState) {
return maritalState.state.equals(SINGLE);
}
public boolean isWidow(MaritalState maritalState) {
return maritalState.state.equals(WIDOW);
}
public String get() {
return state;
}
}