java设计模式学习笔记第三章

适配器(Adapter)模式

接口适配

  适配器模式的意图在于,使用不同接口的类所提供的服务为客户端提供它所期望的接口

<interface>                                                     PhysicalRocket

RocketSim                                                      PhysicalRocket(

getMass():double                                                  burnArea:double,

getThrust():double                                                burnRate:double,

setSimTime(t:double)                                            fuelMass:double,

totalMass:double)

getBurnTime():double

getMass(t:double):double

getThrust(t:double):double

OozinoRocket

挑战3.1完成上面,展现OozinoRocket类的设计,它将让PhysicalRocket对象作为RocketSim对象参与到仿真行为中。假定你无法修改RocketSim与PhysicalRocket类。

OozinoRocket extends PhysicalRocket implements RocketSim

正确答案:

挑战3.2完成上面完成getMass和getThrust方法代码。

 1 package com.oozinoz.firework;
 2 import com.oozinoz.simlation.*;
 3
 4 public class OozinozRocket
 5     extends PhysicalRocket implements RocketSim{
 6     private double time;
 7     public OozinozRocket(
 8            double burnArea,double burnRate,
 9            double fuelMass,double totalMass){
10          super(burnArea,burnRate,fuelMass,totalMass);
11     }
12     public double getMass(){
13         //挑战
14         return getMass(time);
15     }
16     public double getThrust(){
17         //挑战
18         return getThrust(time);
19     }
20     public void setSimTime(double time){
21         this.time = time;
22     }
23 }

对象适配器

  OozinozSkyrocket对象继承自Skyrocket,现在还要满足拥有另一个类的功能即PhysicalRocket类。就要拥有这个类的实例。

public class OozinozSkyrocket extends Skyrocket{
    private PhysicalRocket rocket;

    public OozinozSkyrocket(PhysicalRocket r) {
        super(r.getMass(0), r.getThrust(0), r.getBurnTime());
        rocket = r;
    }

    public double getMass(){
        return rocket.getMass(simTime);
    }
    public double getThrust(){
        return rocket.getThrust(simTime);
    }
}

下面来介绍JTable对数据的适配

抽象类为TableModel接口提供了默认的实现。

如果需要设计Swing的用户界面在表中显示几个火箭。可以创建RocketTableModel类将这组火箭适配为TableModel所期待的接口

无论何时,只要我们需要使用的抽象类对要适配的接口提供支持,就必须使用对象适配方式。

书中的解释是这样的:

我是这么理解的:为什么重用的方式只能是继承或组合方式呢?实现接口方式也可以重用第三方啊?开始我也很迷惑但是想一下就会感觉这句话很对。因为,第三方是有功能的,它实现了一些方法。也就是有具体操作。所以要用组合的方式来把这个对象容纳到这个类里面。如果是用实现接口的方式即(implements Interface)来扩展功能。的确你扩展了几个方法。但是接口只是约束你要有这几个方法。并且你还要自己来实现它。所以我感觉,接口的方式在这里并不适用。书上说的很对!

下面有更让我崩溃的说法是,RocketModel并非Rocket的子类。当适配类必须从多个对象处获取信息时,通常就应该使用对象适配器。很全面的证明了对象适配必须用组合方式。

注意区分:类的适配器继承自现有的类,同时实现目标接口。对象适配器继承自目标类,同时引用现有类。

 1 public class RocketTableModel extends AbstractTableModel{
 2      protected Rocket[] rockets;
 3      protected String[] colunmNames =
 4           new String[]{"Name","Price","Apogee"};
 5      public  RocketTableModel(Rocket[] rockets){
 6           this.rockets = rockets;
 7      }
 8
 9      public int getColumnCount(){
10           //挑战
11           return super.getColumnCount();
12      }
13
14      public String getColumnName(int i){
15           //挑战
16           return colunmNames[i];
17      }
18
19      public int getRowCount(){
20           //挑战
21           return getRowCount();
22      }
23
24      public Object getValueAt(int row,int col){
25           //挑战
26           Rocket r = Rockets[row];
27           String name = getColumnName[col];
28           Method method = Rocket.class.getDeclaredMethod(name, null);
29           Object value = method.invoke(r,null);
30           return value;
31      }
32 }

挑战的位置是让我补全的代码。上面是我自己写的。看看正确答案。

我应该直接用自己实现的数据集合做

colunmNames.length而不是super.getColumnCount()
rockets.length而不是getRowCount()对于getValueAt方法,我之前想按照答案的方式做出来。但是还需要判断。我想直接用反射,反射出get方法。然后调用rocket的get方法就能得到值。但是我这段代码没有抛异常。没在ide下写。是直接手写的。
时间: 2024-10-04 05:32:27

java设计模式学习笔记第三章的相关文章

Java Web 学习笔记 第三章 java基础(二)

第三章 java基础(二) 一.转义符 转义字符是"\",通过转义字符,可表示一些特殊的字符. 例如: '\n'  表示回车 '\t'   表示 制表符字符,一个制表符表示向右跳8-10个字符 '\\'   表示\ '\''   表示单引号 '\"'  表示双引号 "\u4e2d"表示unicode编码对应的字符(汉字:中). 二.布尔类型的概念和用法 boolean 类型用来表示肯定或否定两种可能. boolean 常用在分支语句.循环语句中. true

Java设计模式学习笔记,三:建造者模式

建造者模式:实现了构建和装配的解耦,即对象的各个子组件单独构建,再进行装配,从而建造完整对象. 该模式适用于构建较为复杂的对象(多个子组件). 不同的构建者,使用相同的装配者,可以建造不同的对象实例.相同的构建者,不同的装配顺序,也可能建造出不同的对象实例. 举例: 汽车对象,子组件包括引擎.轮子和车体. Audi汽车构建者,负责制造Audi牌各个子组件.BMW汽车构建者,负责制造BMW牌各个子组件.然后将子组件统一送至汽车装配者的生产线中进行组装,最后会建造出Audi牌汽车和BMW汽车. 以下

java JDK8 学习笔记——第16章 整合数据库

第十六章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API中的接口会有数据库厂商操作,称为JDBC驱动程序. 2.JDBC标准主要分为两个部分:JDBC应用程序开发者接口和JDBC驱动程序开发者接口.应用程序需要联机数据库,其相关API主要在java.sql和javax.sql两个包中. 3.应用程序使用JDBC联机数据库的通用语法: Connection conn = DriverManager.g

Shell学习笔记——第三章

第三章 /etc/passwd 文件包含一个所有系统用户账户组成的列表,以及一些关于每个用户的基本信息. 例rich:x:501:Rich Blum:/home/rich:/bin/bash 每个条目都有7个数据字段,例使用冒号分隔.系统使用这些字段中的数据向用户分配具体的特性.这些字段分别有 用户名:用户密码(如果密码存储在其他文件中,则为占位符):用户的系统用户ID编号:用户的系统组的ID编号:用户的全名:用户默认的主目录:用户的默认Shell目录: cd 命令 略过 列表命令(ls) 参数

Java学习笔记—第三章

第三章  标识符.关键字和数据类型 1. Java标识符和关键字:在程序设计中,通常用一个记号对变量.常量.方法和类等进行标识,这个记号称为标识符.Java语言本身使用了一些标识符,这些标识符称为Java关键字,用户在命名标识符时应该避免使用这些Java关键字,否则将导致程序无法进行编译. Java中的关键字如下: abstract 抽象 assert 断言 boolean 布尔 break 中断 byte 字节 catch 捕获 char 字符 class 类 continue 继续 defa

Java学习笔记—第三章 标识符、关键字和数据类型

第三章  标识符.关键字和数据类型 1. Java标识符和关键字:在程序设计中,通常用一个记号对变量.常量.方法和类等进行标识,这个记号称为标识符.Java语言本身使用了一些标识符,这些标识符称为Java关键字,用户在命名标识符时应该避免使用这些Java关键字,否则将导致程序无法进行编译. Java中的关键字如下: abstract 抽象 assert 断言 boolean 布尔 break 中断 byte 字节 catch 捕获 char 字符 class 类 continue 继续 defa

【PMP】Head First PMP 学习笔记 第三章 过程框架

第三章 过程框架 项目中完成的所有工作都由过程构成. 项目中的完成的所有工作都有一个模式(pattern).先计划,再去做.工作时,总是对项目与原先的计划进行比较.如果开始偏离计划,就要由你做出矫正,让一切重新走上正轨.过程框架--过程租和知识领域--正式这一切顺利完成的关键. 分阶段管理 分阶段,项目的每个阶段(phase)都会经过5个过程租,从启动到收尾,项目的多个阶段就会存在各种关联关系 顺序关系(sequenital relationship).多个阶段相继发生并不存在重叠,每个阶段在前

c#高级编程第七版 学习笔记 第三章 对象和类型

第三章 对象和类型 本章的内容: 类和结构的区别 类成员 按值和按引用传送参数 方法重载 构造函数和静态构造函数 只读字段 部分类 静态类 Object类,其他类型都从该类派生而来 3.1 类和结构 类和结构都是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法 结构和类的区别是他们在内存中的存储方式.访问方式(类是存储在堆上的引用类型,而结构是存储在栈上的值类型)和他们的一些特征(如结构不支持继承).较小的数据类型使用结构可提高性能.但在语法上,结构和类非常相似,主要的区别是使用

【MySQL】《高性能MySQL》 学习笔记,第三章,服务器性能剖析

第三章:服务器性能剖析 ? 本章将针对如下三个问题进行解答: ? 如何确认服务器是否达到了性能最佳的状态 ? 找出某条语句为什么执行不够快 ? 诊断被用户描述成"停顿","堆积","卡死"的某些间歇性疑难故障 1.性能优化简介: ? 针对性能问题,1000个DBA,有1000个回答.诸如,"QPS","CPU Load","可扩展性"之类. 原则一:我们将性能定义为完成某件任务所需要的时