【问题标题】:OO programming about state关于状态的 OO 编程
【发布时间】:2018-11-26 08:04:17
【问题描述】:

这是我教授的 oo 编程作业。但是我发现婚姻状况可以是Person类中的一个变量,如何通过两个类来实现呢?

假设人们可以有婚姻状况:单身、已婚、寡妇、离婚。创建处理人们婚姻状况的状态 OODP(即 Java、JavaScript、C++、Python 或 Ruby)。您将至少有两个类:Person 和 Marital State。确保遵循以下规则:单身->已婚已婚->离婚|寡妇离婚-> 已婚寡妇-> 已婚创建一个客户端类来测试您的程序。确保您测试有效和无效的婚姻状况变化。
The assignment page


这些是我的代码:

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);
    }
}

【问题讨论】:

  • 欢迎来到 Stack Overflow!请拨打tour 并访问我们的help center,了解适合本网站的问题类型。如果您可以edit您的问题符合本网站的要求,请这样做。
  • 不相关:阅读 java 命名规则。方法名称应该围绕动词构建,并且它们使用 camelCase()。在 java 中只有类名以大写字母开头。
  • 你的教授有没有说你只需要使用 2 个类,或者你可以使用更多的类吗?

标签: java oop design-patterns object-oriented-analysis


【解决方案1】:

这里:

String maritalstatus;

这可能不是你的教授想要的。婚姻状况的要点是:只有一组固定的价值观。

正确的表达方式是在java中使用enum,例如:

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

然后您可以通过创建一个状态机来进一步增强此功能,该状态机实施规则,例如:当您是 SINGLE 时,doMarry(),之后您的新状态应该是 MARRIED。 p>

【讨论】:

  • 当教授告诉学生使用诸如 Javascript 或 Ruby 之类的语言时,在我看来,教授会想要一个与 enum 不同的解决方案
  • @Roman 这个问题被标记为 Java,这足以让我给出一个专注于 Java 的答案 ;-)
【解决方案2】:

在复制和过去之前..

这个解决方案可能不是您的教授想要的。在这种情况下可以使用多种其他解决方案。

在以下解决方案中我假设您只能使用 2 个类!

可能的解决方案

您的Person 应该有一个MaritalState 类型的字段。这个MaritalState 跟踪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);
  }
}

婚姻状况

原来处于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;
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-13
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多