掌握接口,从这三则案例开始! | 带你学《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面向对象编程文章查看此处

相关文章
|
2月前
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
2月前
|
存储 缓存 安全
Java集合框架(二):Set接口与哈希表原理
本文深入解析Java中Set集合的工作原理及其实现机制,涵盖HashSet、LinkedHashSet和TreeSet三大实现类。从Set接口的特性出发,对比List理解去重机制,并详解哈希表原理、hashCode与equals方法的作用。进一步剖析HashSet的底层HashMap实现、LinkedHashSet的双向链表维护顺序特性,以及TreeSet基于红黑树的排序功能。文章还包含性能对比、自定义对象去重、集合运算实战和线程安全方案,帮助读者全面掌握Set的应用与选择策略。
164 23
|
2月前
|
安全 Java 开发者
Java集合框架:详解Deque接口的栈操作方法全集
理解和掌握这些方法对于实现像浏览器后退功能这样的栈操作来说至关重要,它们能够帮助开发者编写既高效又稳定的应用程序。此外,在多线程环境中想保证线程安全,可以考虑使用ConcurrentLinkedDeque,它是Deque的线程安全版本,尽管它并未直接实现栈操作的方法,但是Deque的接口方法可以相对应地使用。
129 12
|
2月前
|
存储 安全 Java
Java集合框架(一):List接口及其实现类剖析
本文深入解析Java中List集合的实现原理,涵盖ArrayList的动态数组机制、LinkedList的链表结构、Vector与Stack的线程安全性及其不推荐使用的原因,对比了不同实现的性能与适用场景,帮助开发者根据实际需求选择合适的List实现。
|
2月前
|
Java API 网络架构
java调用api接口自动判断节假日信息
java调用api接口自动判断节假日信息
705 0
|
Java
Java接口和抽象类
Java接口和抽象类
176 0
|
设计模式 搜索推荐 Java
java接口和抽象类的区别,以及使用选择
java接口和抽象类的区别,以及使用选择
151 0
|
设计模式 Java
【惊天揭秘】Java编程绝技大曝光:接口、抽象类、静态类与非静态类的神秘面纱终被揭开!
【8月更文挑战第22天】Java支持面向对象编程,通过接口、抽象类、静态类(如枚举与工具类)及普通类实现设计原则。接口定义行为规范,允许多重继承;抽象类含未实现的抽象方法,需子类完成;静态类常为工具类,提供静态方法;普通类则实例化对象。恰当运用这些结构能提升程序质量。
110 2
|
Java 开发者
Java中的接口和抽象类
Java中的接口和抽象类
139 3
Java的接口与抽象类的区别
Java的接口与抽象类的区别
138 5