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

本文深入探讨了适配器模式的应用场景与实现方法,包括接口适配与对象适配的区别,通过具体的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下写。是直接手写的。

转载于:https://www.cnblogs.com/conglanjun/p/5236903.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值