day10-多态性和集合,MVC

Java 多态性和集合

模型-视图-控制器MVC(Model-View-Controller)

控制器 -- 事务处理逻辑 Event Handling logic ;

视图 -- 展示Display;渲染逻辑Rendering logic(任何模型中的状态改变,会自动渲染到视图中。)

模型 -- (数据、逻辑、业务规则) 域Domain;

image-20210223030208906

例子:

四个类CalculatorModel, CalculatorView, CalculatorController, MVCCalculator (main方法存在的类,运行程序)。

  • main:用new创建M、V、C,并使视图状态为可见。

  • 模型:模型执行所有需要的计算,且模型不知道视图的存在。模型存储数字求和的值,并将其输入到视图中。

  • 视图:唯一职责是展示用户视图。不执行任何计算,但传递用户输入的信息到所需的地方去。有一些与控制器关联link的方法,如getFirstNumbersetCalcSolution(文字域),还有addCalculatListener:一旦计算按钮被按下,就执行控制器中的actionPerformed方法。

  • 控制器:定义控制器时就需要输入对视图、模型的引用,因此将三者联系起来。协调视图和模型间的交互:从视图获得数字getFirstNumber,从模型获得求和theModel.addTwoNumbers(firstNumber, secondNumber),把从模型获得求和值设置给视图theView.setCalcSolution(theModel.getCalculationValue())

例子:胜利检测逻辑位于controller而不是model的原因:

​ 一般来说,模型包含的是数据、数据结构、访问数据结构的方式。

​ 控制器只有决策制定过程逻辑,以及有效性检查,比如事件执行、错误报告,都是在控制器内进行的。如果放在模型中,就不一定被调用于执行了。

灵活性

使用情景:需要2D数组存储任意时刻的当前面板状态,简单2D数组不够,还要允许游戏中途修改面板尺寸,所有格子被填满为平局时,面板size可被增加使得游戏继续,直到一方终于胜利。

Java部分库支持使用动态数据类型,比如:队列、栈、列表等,来存储大小动态变化的多组对象。动态数组好处是可以动态地扩容(类似C的realloc()函数)

类对象是类关系树的核心

单向遗传中,一类只来源于一个直系父类,所有类间继承关系最终形成树状结构,其核心是类对象。可以不断向下转型casting调用各种特定的属性、方法。

对象栈ObjectStack——向下转型的原理

  • 对象栈执行接口合约,可类似于C的linkedlist,实现push、pop、peek、empty功能。
  • 执行向下转型:类似于C的void pointer能存储任意类型数据,java通过对象的转型 (在前面加上"(_TargetClass)"标记)能转换为任意我们需要访问的特定成员的类型。执行后,对象栈将检索该目标对象。
  • 对象栈通过从“peek”的各种对象中检索目标类,来实现向下转型
  • 但存在一个问题:程序员必须保证向下转型能够成功,否则将导致异常Exception。
image-20210225141132708 image-20210225141339729

泛型 Generics

泛型允许指定一个特的定复合数据结构来存储特定的对象类型。这使我们能使用无类型的数据结构,但同时强迫在编译时进行类型检查。

  • 如果存在向下转型的问题,我们只能在运行时才发现。但Java5起泛型的引入,解决了这一问题。
  • 泛型使编译器在编译时就可追踪对象类型,无需依赖程序员。通过<...>参数化类的类型,以减少向下转型的失控现象。
  • < V >中类的类型V不能是原始数据类型,需是对任意对象的引用,如Stack、String等。
  • 由于在pop()、peek这两个返回值类型为V的函数中,V result = (V) stack[size-1]; return result;
  • 所以此时向下转型为V类型,不再失控,保持是V类型(改变的是reference,不改变object,object一直是Robot)。而push、empty本就不返回原类型,因此可以直接push (new CarrierRobot())
image-20210225141444920

集合 Collections

将模型类中,面板格子的数据结构从数组转换为动态数组(arraylist)。目前无需测试动态改变board size,用arraylist复现model当前已足够。下一节再测试模型中的变化。

注意:改变数组至动态数组,需要修改cells变量的声明和初始化,以及格子占有者getter 和setter的方法。

集合包(Collection package)提供了许多有用的复合数据结构,这都利用了前面概述的泛型机制。

  • 集合是将多个元素组织为单一单元的一个容器。
  • Java 集合框架(JCF - Java Collection framework)是Java所有库中的最重要之一,提供高质量执行架构。
  • 使用泛型来灵活写入包含的元素类型,而且是多态性建构的,因此同样的方法在不同的集合中也工作。
image-20210223231243756

List是接口,List包括Arraylist,定义使用List比Arraylist会更灵活。

ArrayList具有动态扩容的机制,每次在添加元素时,都会判断容量是否够用,如果不够用,则需要扩容。

  1. 声明一个动态数组(Arraylist)类的对象list,可以很灵活地add, rm, printf(运用list的接口)。该数组内所存的,是不同的Robot“类”对象。
  2. 因为将这个list与< Robot >一同声明,此list可以使用多态性添加许多不同的Robot、Robot的各种子类、以及Robot类本身。
image-20210225141854725

注意:list.add(1, new Robot("C4PO"))的意思是在索引=1的位置,插入C4PO。

posted @ 2021-03-01 17:45  吃饭睡觉打代码  阅读(93)  评论(0)    收藏  举报