一、接口与抽象类的区别:
1、一个类可以实现多个接口,只能继承一个类;
2、抽象类可以包含具体的方法,接口的方法都是抽象的;
3、抽象类可以声明和使用字段;接口不能,接口只能有static final常量
4、抽象类可以是public、protected、private或者默认的package,而接口全为public
5、抽象类可以定义构造函数,接口不能。
接口描述了类协作中它所期望与不期望的行为。工程师设计了很多火箭,有固体燃料火箭也有液体燃料火箭,不能火箭如何组成,但是对火箭仿真必须提供预期的推理、质量等数据。
public interface RocketSim{ abstract double getMass(); public double getThrust(); void setSimTime(double t); }
接口的声明public不应该省略,否则接口的可见性限制在包内。三个方法都是abstract public的。接口可以扩展。接口中可以定义常量,实现该接口的类可以访问它。
二、适配器(Adapter)
其作用是将一个类的接口,变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类能够一起工作。
适配器模式包含两种,一种是类适配器,另一种是对象适配器。类适配器是通过类的继承实现的适配,而对象适配器是通过对象间的关联关系,组合关系实现的适配。
适配器模式是一种补救模式,不管之前的可行性分析、需求分析、系统设计处理的多么完美,总会出现一些“意外”。适配器模式最好在设计阶段不要考虑它,它不是为了解决还处在开发阶段的问题,而是解决正在服役的项目问题。
NewClass继承ExistingClass,实现接口RequiredInterface。NewClass中重写的requiredMethod方法
委托给ExistingClass的usefulMethod实现。
public interface Weather { void show(); //显示天气 }
public class TodayWeather { private int[] data; public TodayWeather(int data[]){ this.data=data; } void showWeather(int time){ //...根据data来计算时间time的天气 } }
已经有两个类,现在想显示当前天气,可以如下做:
public class CurrentWeather extends TodayWeather implements Weather{ private int time=0; public CurrentWeather(int[] data) { super(data); } public void setTime(int time){ this.time=time; } @Override public void show(){ if(time>0&&time<24) showWeather(time); } }
以上是类适配器,下面是一个对象适配器的例子:
public class Weather { private String s; private int t; public Weather(){s=null;t=0;} public Weather(String s,int t ){ this.s=s;this.t=t; } public void setTime(int time){ this.t=time; } public int getTime(){ return t; } void show(){ System.out.println("Time:"+t+";Weather:"+s); }; }
public class CurrentWeather extends Weather{ private TodayWeather todayWeather; public CurrentWeather(TodayWeather todayWeather){ this.todayWeather=todayWeather; } @Override public void show(){ todayWeather.showWeather(super.getTime()); } }
类的适配器继承现有的类并且实现目标接口;对象适配器继承目标类同时引用现有的类。
JTable可以用表格的形式显示TableMode型的“数据”。那么要想显示自己的数据,可以构造一个类继承TableModel,这个类中引用现有的数据。
public class Student { private String name; private int age; private int score; public Student(String name,int age,int score){ this.name=name; this.age=age; this.score=score; } public String getName(){return name;} public int getAge(){return age;} public int getScore(){return score;} }
接下来是一个适配器类,它是Student与JTable之间的桥梁:
import javax.swing.table.AbstractTableModel; public class StudentTableModel extends AbstractTableModel{ private Student[] student; private String[] columns={"姓名","年龄","分数"}; public StudentTableModel(Student[] student){ this.student=student; } @Override public int getColumnCount() { return columns.length; } @Override public int getRowCount() { return student.length; } @Override public String getColumnName(int i){ return columns[i]; } @Override public Object getValueAt(int rowIndex, int columnIndex) { switch(columnIndex){ case 0:return student[rowIndex].getName(); case 1:return student[rowIndex].getAge(); case 2:return student[rowIndex].getScore(); default:return null; } } }
下面是显示:JTable中传递了个参数是StudentTableModel类型的
import java.awt.Dimension; import java.awt.Font; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.UIManager; public class ShowStudents { public static void main(String[] args){ setFonts(); JTable table=new JTable(setStudentTableModel()); table.setRowHeight(36); JScrollPane pane=new JScrollPane(table); pane.setPreferredSize(new Dimension(300,100)); display(pane,"sheet"); } private static void display(JScrollPane pane,String s){ JFrame frame=new JFrame(s); frame.getContentPane().add(pane); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } private static StudentTableModel setStudentTableModel(){ Student s1=new Student("王小二",18,80); Student s2=new Student("赵武",19,83); return new StudentTableModel(new Student[]{s1,s2}); } private static void setFonts(){ Font font=new Font("Dialog",Font.PLAIN,18); UIManager.put("Table.font", font); UIManager.put("Table.font", font); UIManager.put("TableHeader.font", font); } }
运行结果;
相关推荐
今天我们要探讨的是JAVA设计中的两个重要模式:抽象类与适配器模式。 首先,我们来理解一下“抽象”。抽象是面向对象编程的核心概念之一,它帮助我们处理对象的复杂性。在Java中,抽象通常通过抽象类来实现。抽象类...
在这个Java实现中,我们将深入探讨适配器模式的两大类型:类适配器模式和对象适配器模式,并通过具体的代码示例和UML类图来阐述其工作原理。 首先,我们来理解适配器模式的基本概念。适配器模式就像现实生活中的...
适配器模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,特别是在解决系统间的兼容性和接口不匹配问题时。适配器模式的核心思想是将一个类的接口转换成客户希望的另一个接口,使原本由于接口不兼容而无法...
适配器模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,特别是在解决系统间的兼容性和接口不匹配问题时。适配器模式的核心思想是将一个类的接口转换成客户希望的另一个接口,使原本由于接口不兼容而无法...
Java动态代理模式与适配器模式是两种在软件设计中常用的设计模式,它们都有各自的优点和应用场景。在Java中,动态代理模式主要依赖于Java的反射API和InvocationHandler接口,而适配器模式则用于解决不同接口之间的...
适配器模式是一种在软件工程中广泛使用的结构型设计模式,它允许两个不兼容的接口之间进行通信。在Java中,适配器模式扮演着重要的角色,尤其在处理遗留代码或者第三方库集成时,能够有效地解决接口不匹配的问题。...
适配器模式是一种设计模式,它允许不兼容的类或接口之间进行通信,通过创建一个适配器类作为中间桥梁,使得原本不匹配的接口能够协同工作。在Java中,适配器模式广泛应用于系统集成、旧代码复用以及第三方库的兼容性...
适配器模式是一种软件设计模式,它允许两个不兼容的接口之间进行通信。在这个案例中,我们关注的是如何通过适配器模式解决实际编程问题。文章《适配器模式案例代码》提供了具体的实现示例,链接指向了CSDN博主...
适配器模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,特别是在处理系统集成、遗留代码重用以及不同接口之间兼容性问题时。适配器模式的主要目的是将两个不兼容的接口融合在一起,使得原本无法直接协作...
适配器模式是一种常用的设计模式,它在软件开发中起到了桥梁的作用,允许两个不兼容的接口之间进行通信。在这个“适配器模式demo源码”中,我们可以深入理解这一模式的实现方式及其应用场景。 适配器模式的核心思想...
适配器模式是一种软件设计模式,它在不同的接口之间起到了桥梁的作用,使得原本由于接口不兼容而无法协作的类能够协同工作。这种模式的核心思想是将一个类的接口转换成客户希望的另一个接口,从而使原有类能适应新的...
适配器模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,允许不同接口的类之间进行通信。适配器模式的核心思想是将一个类的接口转换成客户期望的另一个接口,使得原本由于接口不兼容而无法一起工作的类...
适配器模式是一种软件设计模式,它允许两个不兼容的接口之间进行通信。在本实验中,我们将深入探讨适配器模式的概念、应用场景以及如何在实际编程中实现它。适配器模式通常分为类适配器和对象适配器两种形式。 ...
适配器模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,允许不兼容的接口之间进行通信。在这个源代码实例中,我们看到的是如何通过适配器模式来实现不同对象之间的协作,使得原本无法直接交互的系统组件...
适配器模式(Adapter)是软件工程中一种常用的设计模式,它允许两个不兼容的接口之间进行通信。在C++编程中,适配器模式能够帮助我们复用现有的类,或者将第三方库的接口与我们的系统接口进行对接,从而提高代码的可...