java设计模式学习笔记第三章
2016-03-06 12:18
573 查看
适配器(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方法代码。
对象适配器
OozinozSkyrocket对象继承自Skyrocket,现在还要满足拥有另一个类的功能即PhysicalRocket类。就要拥有这个类的实例。
下面来介绍JTable对数据的适配
抽象类为TableModel接口提供了默认的实现。
如果需要设计Swing的用户界面在表中显示几个火箭。可以创建RocketTableModel类将这组火箭适配为TableModel所期待的接口
无论何时,只要我们需要使用的抽象类对要适配的接口提供支持,就必须使用对象适配方式。
书中的解释是这样的:
我是这么理解的:为什么重用的方式只能是继承或组合方式呢?实现接口方式也可以重用第三方啊?开始我也很迷惑但是想一下就会感觉这句话很对。因为,第三方是有功能的,它实现了一些方法。也就是有具体操作。所以要用组合的方式来把这个对象容纳到这个类里面。如果是用实现接口的方式即(implements Interface)来扩展功能。的确你扩展了几个方法。但是接口只是约束你要有这几个方法。并且你还要自己来实现它。所以我感觉,接口的方式在这里并不适用。书上说的很对!
下面有更让我崩溃的说法是,RocketModel并非Rocket的子类。当适配类必须从多个对象处获取信息时,通常就应该使用对象适配器。很全面的证明了对象适配必须用组合方式。
注意区分:类的适配器继承自现有的类,同时实现目标接口。对象适配器继承自目标类,同时引用现有类。
挑战的位置是让我补全的代码。上面是我自己写的。看看正确答案。
我应该直接用自己实现的数据集合做
接口适配
适配器模式的意图在于,使用不同接口的类所提供的服务为客户端提供它所期望的接口。
<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方法代码。
package com.oozinoz.firework; import com.oozinoz.simlation.*; public class OozinozRocket extends PhysicalRocket implements RocketSim{ private double time; public OozinozRocket( double burnArea,double burnRate, double fuelMass,double totalMass){ super(burnArea,burnRate,fuelMass,totalMass); } public double getMass(){ //挑战 return getMass(time); } public double getThrust(){ //挑战 return getThrust(time); } public void setSimTime(double time){ this.time = time; } }
对象适配器
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的子类。当适配类必须从多个对象处获取信息时,通常就应该使用对象适配器。很全面的证明了对象适配必须用组合方式。
注意区分:类的适配器继承自现有的类,同时实现目标接口。对象适配器继承自目标类,同时引用现有类。
public class RocketTableModel extends AbstractTableModel{ protected Rocket[] rockets; protected String[] colunmNames = new String[]{"Name","Price","Apogee"}; public RocketTableModel(Rocket[] rockets){ this.rockets = rockets; } public int getColumnCount(){ //挑战 return super.getColumnCount(); } public String getColumnName(int i){ //挑战 return colunmNames[i]; } public int getRowCount(){ //挑战 return getRowCount(); } public Object getValueAt(int row,int col){ //挑战 Rocket r = Rockets[row]; String name = getColumnName[col]; Method method = Rocket.class.getDeclaredMethod(name, null); Object value = method.invoke(r,null); return value; } }
挑战的位置是让我补全的代码。上面是我自己写的。看看正确答案。
我应该直接用自己实现的数据集合做
colunmNames.length而不是super.getColumnCount()
rockets.length而不是getRowCount() 对于getValueAt方法,我之前想按照答案的方式做出来。但是还需要判断。我想直接用反射,反射出get方法。然后调用rocket的get方法就能得到值。但是我这段代码没有抛异常。没在ide下写。是直接手写的。
相关文章推荐
- java dom4j 曾删改查、编码XML文件
- 白话Spring(基础篇)---编程式事务(1)
- java设计模式学习笔记第二章
- SPRING IN ACTION 第4版笔记-第七章Advanced Spring MVC-006- 如何保持重定向的request数据(用model、占位符、RedirectAttributes、model.addFlashAttribute("spitter", spitter);)
- eclipse 安装struts2 插件
- 简要介绍JAVA8中的函数式编程;Brief Introduction to Functional Programming in Java 8
- 20145216史婧瑶《Java程序设计》第一周学习总结
- 20145216史婧瑶《Java程序设计》第一周学习总结
- Android Sdk 和ADT Eclipse安装配置步骤
- 安装Java jdk1.6或1.7的详细步骤和配置环境变量的另类办法
- java基础题目总结
- HDU—— 2005 第几天? (java版)
- Java 抽象类与接口区别
- hadoop源码分析环境搭建(win7+cygwin+jdk+ant+eclipse+Hadoop-1.0.0)
- Spring AOP(一)之Before增强处理
- Spring之占位符配置器
- Java集合框架之规则集
- 【J2EE】:Java EE应用的分层模型
- Spring之后处理器
- Java集合框架之概括