ОО программирование о состоянии - PullRequest
0 голосов
/ 26 ноября 2018

Это задание моего профессора по программированию.Но я обнаружил, что семейное положение может быть переменной в классе Person, как я могу достичь этого с двумя классами?

Предположим, что люди могут иметь семейное положение: холост, женат, вдова, разведен.Создайте состояние OODP (т. Е. Java, JavaScript, C ++, Python или Ruby), которое касается семейного положения людей.У вас будет как минимум два класса: Персона и Семейное положение.Убедитесь, что соблюдаются следующие правила: холост - замужем женат - разведен |Вдова разведена -> замужем Вдова -> замужем создайте класс Client для тестирования вашей программы.Убедитесь, что вы проверяете действительное и недействительное изменение семейного положения.
Страница назначения


Это мои коды:

public class AssignmentOOP {
    public static void main(String[] args) {
        Person p1 = new Person("p1");
        Person p2 = new Person("p2");
        Person p3 = new Person("p3");
        p1.PrintMaritalStatus();
        p2.PrintMaritalStatus();
        p3.PrintMaritalStatus();
        p1.GetMarried(p2);
        p1.GetMarried(p3);
        p2.Died();
        p1.GetMarried(p3);
    }
}

class Person {
    String maritalstatus;
    boolean mateIsAlive;
    Person mate;
    String name;

    Person(String name1) {
        maritalstatus = "single";
        mate = null;
        name = name1;
    }

    void GetMarried(Person mate) {
        if(this.maritalstatus.equals("married")|| mate.maritalstatus.equals("married"))
        {
            System.out.println("Marital status error! At least one of you are married");
            return;
        } else {
            this.maritalstatus = "married";
            this.mate = mate;
            mate.maritalstatus = "married";
            mate.mate = this;
            System.out.println("Congratulations!!! " + this.name + " and " + mate.name + " are married!");
        }
    }

    void GetDivorced(Person mate) {
        if(this.maritalstatus.equals("married") && this.mate == mate) {
            maritalstatus = "divorced";
            System.out.println(this.name+" and "+mate.name+" are getting divorced.");
        }else if(this.maritalstatus.equals("single")) {
            System.out.println("You are not married and you cannot get divorced before getting married");
        }else if(maritalstatus.equals("widow")) {
            System.out.println("Your marital status is widow, you cannot get divorced.");
        }
    }

    void Died() {
        this.maritalstatus = "dead";
        this.mate.maritalstatus = "widow";
        System.out.println("Sorry for your loss, " + this.mate.name + " marital status is widow.");
    }

    void PrintMaritalStatus() {
        System.out.println(this.name + " marital status is " + this.maritalstatus);
    }
}

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

До копирования и после ..

Возможно, это решение не то, чего хочет ваш профессор.В этом сценарии можно использовать несколько других решений.

В следующем решении Я предполагаю, что вы можете использовать только 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;
  }
}
0 голосов
/ 26 ноября 2018

Здесь:

String maritalstatus;

Это, вероятно, не , что хочет ваш профессор.Смысл этого семейного положения таков: существует только фиксированный набор значений.

Правильный способ выразить это - использовать enum в java, например:

public enum MaritalStatus { SINGLE, MARRIED, ... } 

Затем вы можете еще больше улучшить это, создав конечный автомат , который реализует правила, такие как: когда вы ЕДИНСТВЕННЫЙ, и doMarry(), ваш новый статус должен быть ЖЕНЕНО впоследствии.

...