掌握接口,从这三则案例开始! | 带你学《Java面向对象编程》之六十二

简介: 本节手把手带着读者借助接口和工厂设计模式完成获取类信息、处理绘图、设计图形类三则案例。

上一篇:快速分清抽象类与接口 | 带你学《Java面向对象编程》之六十一
【本节目标】
通过阅读本节内容,你将掌握接口的一般用法,并能够做到熟练使用接口,通过某些设计模式完成项目的开发。
抽象类与接口是Java里面最为核心的概念,也是所有设计模式的综合体现,包括在日后学习的过程之中也会接触到许多的系统提供的接口和抽象类。接口与抽象类在都可以使用的情况下,一定要优先使用接口,因为接口可以避免单继承的局限。

案例分析一

定义一个ClassName接口,接口中只有一个抽象方法getClassName();设计一个类Company,该类实现接口ClassName中的方法getClassName(),功能是获取该类的类名称;编写应用程序使用Company类。

interface IClassName {    //按照要求定义接口
    public String getClassName() ;     //数据一定要返回
}
class Company implements IClassName {
    public String getClassName() {
        return “Company” ;
    }
}
public class JavaDemo {
    public static void main(String args[]) {
        IClassName ica = new Company() ;
        System.out.println(ica.getClassName()) ;
    }
}

执行结果:Company

接口前追加一个字母I是一个良好的习惯,也是这几年一直强调的定义原则。

案例分析二(绘图处理)

考虑一个绘图的标准,并且可以根据不同的图形来进行绘制;

image.png
图一 绘图标准

interface IGraphical {    //定义绘图标准
    public void paint() ;   //绘图
}
class Point {
    private double x ;
    private double y ;
    public Point(double x , double y) {
        this.x = x ;
        this.y = y ;
    }
    public double getX() {
        return this.x ;
    }
    public double getY() {
        return this.y ;
    }
}
class Triangle implements IGraphical {   //绘制三角形
    private Point [] x ;     //保存第一条边的坐标
    private Point [] y ;     //保存第二条边的坐标
    private Point [] z ;     //保存第三条边的坐标
    public Triangle(Point [] x , Point [] y , Point [] z) {
        this.x = x ;
        this.y = y ;
        this.z = z ;
    }
    public void paint() {
        System.out.println(“绘制第一条边,开始坐标:[” + this.x[0].getX() + “,” + this.x[0].getY() + “],结束坐标:[” + this.x[1].getX() + “,” + this.x[1].getY() + “]”) ;
        System.out.println(“绘制第二条边,开始坐标:[” + this.y[0].getX() + “,” + this.y [0].getY() + “],结束坐标:[” + this.y[1].getX() + “,” + this.y[1].getY() + “]”) ;
        System.out.println(“绘制第三条边,开始坐标:[” + this.z[0].getX() + “,” + this.z[0].getY() + “],结束坐标:[” + this.z[1].getX() + “,” + this.z[1].getY() + “]”) ;
    }
}
class Circular implements IGraphical {
    private double radius ;
    public Circular(double radius) {
        this.radius = radius ;
    }
    public void paint() {
        System.out.println(“以半径为 “” + this.radius + “”绘制圆形。”) ;
    }
}
class Factory {
    public static IGraphical getInstance(String className , double … args) {
        if (“Triangle”.equalsIgnoreCase(className)) {
           return new Triangle(new Point [] {new Point(args[0] , args[1]) , new Point(args[2] , args[3])} ,new Point [] {new Point(args[4] , args[5]) , new Point(args[6] , args[7])} ,new Point [] {new Point(args[8] , args[9]) , new Point(args[10] , args[11])}) ;
       }else if(“circular”.equalsIngnoreCase(className)) {
           return new Circular(args[0]) ;
       }else {
           return null ;
       }
    }
}
public class JavaDemo {
    public static void main(String args[]) {
       IGraphical iga = Factory.getInstance(“triangle” , 1.1,2.2,2.3.3,4.4,11.11,22.22,33.33,44.44,111.111,222.222,333.333,444.444) ;
       iga.paint() ;
       IGraphical igb = Factory.getInstance(“circular” , 88.11) ;
       igb.paint() ;
    }
}

image.png
图二 执行结果图

案例分析三(图形)

定义类Shape,用来表示一般二维图形。Shape具有抽象方法area和perimeter,分别用来计算形状的面积和周长。试定义一些二维形状类(如矩形、三角形、圆形、椭圆形等),这些类均为Shape类的子类。

image.png
图三 图形设计

abstract class AbstractShape {
    public abstract double area() ;
    public abstract double perimeter() ;
}
class Circular extends AbstractShape {
    private double radius ;
    public Circular(double radius) {
         this.radius = radius ;
    }
    public double area() {
        return 3.1415926 * this.radius * this.radius ;
    }
    public double perimeter() {
        return 2 * 3.1415926 * this.radius ;
    }
}
class Rectangle extends AbstractShape {
    private double length ;
    private double width ;
    public Rectangle(double length , double width ) {
        this.length = length ;
        this.width = width ;
    }
    public double area() {
        return this.length * this.width ;
    }
    public double perimeter() {
        return 2 * (this.length + this.width) ;
    }
}
class Factory {
    public static AbstractShape getInstance(String className , double … args) {
        if (“Circular”.equalsIgnoreCase(className)) {
           return new Circular(args[0]) ;
        }else if (“Rectangle”. equalsIgnoreCase(className)) {
           return new Circular(args[0] , args[1]) ;
        }else {
           return null ;
        }
    }
}
public class JavaDemo {
    public static void main(String args[]) {
        AbstractShape asa = Factory.getInstance(“Circular” , 1.1) ;
        AbstractShape asb = Factory.getInstance(“Rectangle” , 1.5 , 10.2) ;
        System.out.println(“圆形面积:” + asa.area() + “、圆形周长:” + asa. perimeter()) ;
        System.out.println(“矩形面积:” + asb.area() + “、矩形周长:” + asb. perimeter()) ;
    }
}

image.png
图四 执行图形结果图

使用工厂设计模式完全隐藏了实现的子类。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:危险的转型操作 | 带你学《Java面向对象编程》之六十三
更多Java面向对象编程文章查看此处

相关文章
|
7天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
8天前
|
Java
java线程接口
Thread的构造方法创建对象的时候传入了Runnable接口的对象 ,Runnable接口对象重写run方法相当于指定线程任务,创建线程的时候绑定了该线程对象要干的任务。 Runnable的对象称之为:线程任务对象 不是线程对象 必须要交给Thread线程对象。 通过Thread的构造方法, 就可以把任务对象Runnable,绑定到Thread对象中, 将来执行start方法,就会自动执行Runable实现类对象中的run里面的内容。
22 1
|
13天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
40 4
|
15天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
48 3
|
17天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
34 2
|
18天前
|
Java
Java基础(13)抽象类、接口
本文介绍了Java面向对象编程中的抽象类和接口两个核心概念。抽象类不能被实例化,通常用于定义子类的通用方法和属性;接口则是完全抽象的类,允许声明一组方法但不实现它们。文章通过代码示例详细解析了抽象类和接口的定义及实现,并讨论了它们的区别和使用场景。
|
Java
Java中需要注意的一些案例
Java中需要注意的一些案例
118 0
|
9天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
5天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
25 9