【问题标题】:Get and Set Method and the MVC Design Pattern [duplicate]获取和设置方法和 MVC 设计模式 [重复]
【发布时间】:2015-05-27 17:59:29
【问题描述】:

谁能告诉我或给我看一些能让我完全理解 get 和 set 方法的东西?我已经知道了一些,但它仍然让我感到困惑。

我正在尝试学习 MVC 设计模式,但我发现它很难,因为我还没有完全理解这一点。我以为这很容易,但实际上并不那么容易。好吧,至少对我来说。

您自己的例子将不胜感激。提前谢谢你们:)

【问题讨论】:

  • @LawrenceAiello 感谢您提供信息。肯定会读:)

标签: java model-view-controller


【解决方案1】:

模型、视图、控制器设计模式是一种将 GUI 驱动应用程序的各种组件解耦的有用方法。它提高了凝聚力,从本质上强调了软件中离散元素的责任,并有助于避免不必要的功能重叠。

模型存储所谓的“业务逻辑”。这意味着它包含所有对您的应用程序至关重要的数据。

视图用于处理图形界面。负责管理图形呈现方式的所有内容都在此处定义。

最后,控制器处理事件。这包括异步事件,例如每当按下键、移动鼠标​​或用户触摸屏幕时。它接收这些事件并决定如何处理它们。

所以,它们是如何结合在一起的;模型定义了需要绘制的内容。因此,视图需要渲染的任何图形都包含在模型中。这意味着对模型数据的任何修改都会反过来影响屏幕上绘制的内容;然而,模型只是真正定义了需要绘制的元素,它不知道如何绘制它们;只是如何管理和操纵它们。视图可以获取这些元素,然后在图形上下文中使用它们。另一方面,控制器处理事件并反过来操作模型的内容。它通过使用一组关于每个输入事件将如何影响模型的某些部分的已定义规则来做到这一点。

那么,在这方面,Model、View、Controller可以这样看:

final Model m      = new Model();
final View  v      = new View(m);
final Controller c = new Controller(m);

ControllerView 都需要访问模型才能分别管理和呈现应用程序,但模型并不关心它们中的任何一个。这是因为模型定义了应用程序的核心数据依赖项,它们应该是可转移的,并且独立于它是否是 GUI 的组件而工作。

就 getter 和 setter 方法而言,所有这些都提供对位于类中的成员变量的访问。因此,如果我们查看 View 内部,我们会看到如下内容:

public final class View {

    /* Member Variables. */
    private final Model mModel;

    public View(final Model pModel) {
        /* Initialize Member Variables. */
        this.mModel = pModel;
    }

    public final Model getModel() {
        return this.mModel;
    }

}

方法getModel()称为getter方法;它的唯一责任是返回一个变量;在这种情况下,它返回ViewmModel 变量。 getter 和 setter 方法的有用之处在于您可以control access to that variable;例如,该方法可以声明为publicprotectedprivate,所有这些都改变了还有谁在你的应用程序中可以访问模型。 setter 方法也是如此,它的唯一职责应该是更改属于拥有的Object 的特定变量的值。

【讨论】:

    【解决方案2】:

    我知道这应该是评论,但我目前没有发表评论所需的声誉。

    首先,您能否提供更多关于您具体想了解的信息?您是否对 getter 和 setter 的一般工作方式感到困惑?您是否对 MVC 模式中的工作方式感到困惑? (getter 和 setter 在 MVC 中的工作方式与在其他设计模式中的工作方式相同)。

    如果上面评论中发布的链接不能解决您的问题,那么希望我能提供帮助。 Getter 和 setter(getVarName 和 setVarName)用于提供附加功能(例如确保值符合所需范围等),还用于提供代码封装。除了附加功能(如验证)外,封装还有助于避免错误,例如在您无意中意外更改类变量的值。以 Customer 类为例:

    public class Customer {
    private int empNo;
    private int deptNo;
    //additional class variables
    
    public Customer() {
    //default constructor }
    
    public Customer (int emp, int dept) {
    empNo = emp;
    deptNo = dept;
    }
    
    public int getEmpNo() {
    return empNo;
    }
    
    public void setEmpNo(int emp) {
    empNo = emp;
    }
    
    //other methods
    }
    

    假设所有员工编号必须为 5 位数字且不能以 0 开头。如果我们不使用 setter,则无法检查给定的数字是否为有效数字(或者它是偶数)给定)。为此,我们可以在 setEmpNo 方法中编写一个简单的验证要求。

    public void setEmpNo(int emp) {
        if(emp >= 10000 && emp <= 99999) {
            empNo = emp;
        }
    //code to handle invalid numbers
    }
    

    封装还可以帮助我们避免某些错误,例如在我们只想检查条件中的值时更改 empNo 的值等。例如,如果我们不使用 getter 和 setter 并且只有一个公共 empNo,以下错字会改变员工员工编号的值:

    if(employee1.empNo = 12345) { //checking if this is employee 12345 would use ==
        //perform action for specified employee
    }
    

    但是,如果我们使用 getter 和 setter,我们仍然会遇到问题,因为我们不会检查所需员工的员工编号是否为 12345,但该员工的编号不会永久更改为 12345,并且仍会保留他/她的正确员工编号。这有意义吗?

    看起来有人已经发布了一个关于 MVC 的很好的答案,所以我不会重复任何信息。我要指出的一件事是 MVC 通常(如果不总是)用于基于服务器的应用程序。如果您的应用程序包含用户与之交互的网站和数据库,那么您很有可能会使用 MVC 模式的某些变体。但是,您不会将 MVC 用于 Hello World 应用。

    我希望我的回答不是太基本。如果不获取更多信息,就很难判断用户的知识水平。如果您希望我对我发布的任何内容进行澄清或进一步解释,请告诉我。

    祝你好运。

    【讨论】:

      【解决方案3】:

      当我们定义实例变量私有时使用的getter和setter方法,因此我们不能从外部类直接访问私有实例变量,这对于封装(隐藏来自外部世界的数据)很有用。因此,为了访问私有变量,我们需要一些基本上是 getter 和 setter 的方法。

      public class Employee
      {
        private int empNum;
      
        public Employee(int empNum) {
          this.empNum = empNum;
        }
        public int getEmpNum() {
          return empNum;   
        }
        public void setEmpNum(int empNum) {
          this.empNum = empNum;   
        }
      }
      

      有关我们使用 getter/setter 的更多原因,请阅读此answer
      MVC 和 getter/setter 方法之间没有直接关系。 MVC 基本上是软件开发的设计模式,我们在不同的模块(模型、视图和控制器)之间划分任务

      模型 -> 数据层

      视图 -> 表示层

      controller -> 模型和视图之间的控制器层

      因此,当您在 mvc 中创建模型类时,您为模型定义了多个实例变量(属性),但您不想从控制器直接访问这些变量,因此在这种情况下您应该使用 getter setter 方法。

      实际上 getter/setter 概念不仅限于 mvc,它被用作编码标准和抽象目的。

      【讨论】:

        猜你喜欢
        • 2013-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-18
        相关资源
        最近更新 更多