java--面向抽象编程

所谓面向抽象编程是指当设计某种重要的类时,不让该类面向具体的类,而是面向抽象类,及所设计类中的重要数据是抽象类声明的对象,而不是具体类声明的对象。就是利用abstract来设计实现用户需求。

比如:我们有一个Circle圆类,计算其面积。


1

2

3

4

5

6

7

8

9

public class Circle extends Geometry{

    double r;

    Circle(double r){

        this.r = r;

    }

    public double getArea(){

        return (3.14*r*r);

    }

}

现在要设计一个Pillar(柱类),getvolume()可以计算柱体的体积。


1

2

3

4

5

6

7

8

9

10

11

public class Pillar{

    Circle bottom;

    double height;

    Pillar(Circle bottom, double height){

        this.bottom = bottom;

        this.height = height;

    }

    public double getVolume(){

        return bottom.getArea() * height;

    }

}

在Pillar(柱类)中,bottom是用具体类Circle声明的对象,如果不涉及用户需求的变化,上面Pillar(柱类)的设计没有什么不妥,但是在某个时候,用户希望Pillar(柱类)能创建出底部是三角形的柱体。显然上面的Pillar(柱类)就无法创建出这样的柱体,即上述设计的Pillar(柱类)不能应对用户的这中需求。

重新修改Pillar(柱类)。注意到柱体的计算体积的关键是计算出底面积,一个柱体在计算底面积是不应该关心他的底是社么形状的具体图案,应该只关心这种图像是否具有计算出面积的方法。因此,在设计Pillar(柱类)的时候不应当让他的底是某个具体类的声明的对象,一旦这么做,Pillar(柱类)就会依赖具体类,缺乏弹性,难以应对需求的变化。

第一步:定义一个抽象类Geometry,类中定义一个抽象的getArea()方法,Geometry类如下。这个抽象类将所有计算面积的方法都抽象为一个标识:getArea()无需考虑算法细节。


1

2

3

public abstract class Geometry{

    public abstract double getArea();

}

第二步:Pillar(柱类)可以面向Geometry类编写代码,即Pillar(柱类)应当把Geometry类作为自己的成员,该成员可以调用Geometry的子类重写的getArea()方法。这样,Pillar(柱类)就将计算底面积的任务指派个Geometry类的子类的实例,不再依赖于某一个具体的类,而是面向Geometry类的,即Pillar(柱类)的bottom是用抽象类Geometry声明的对象,而不是具体的某一类,新的Pillar(柱类)如下:


1

2

3

4

5

6

7

8

9

10

11

public class Pillar{

    Geometry botom;

    double height;

    Pillar(Geometry bottom, double height){

        this.bottom = bottom;

        this.height = height;

    }

    public double getVolume(){

        return bottom.getArea() * height;

    }

}

在新增Geometry的子类时就不需要修改Pillar(柱类)的任何代码,只需要增加一个Triangle类(三角形)。


1

2

3

4

5

6

7

8

9

10

public class Rectangle extends Geometry{

    double a,b;

    Circle(double a, double b){

        this.a = a;

        this.b = b;

    }

    public double getArea(){

        return (a*b);

    }

}

应用:


1

2

3

4

5

6

7

8

9

10

11

12

public class Application{

    public state void main(String args[]){

        Pillar pillar;

        Geometry bottom;

        bottom = new Circle(10);             //子类的上转型对象

        pillar = new Pillar(bottom, 10);

        System.out.println("圆柱体的体积" + pillar.getVolume());

        bottom = new Rectangle(10,10);

        pillar = new Pillar(bottom, 10);

        System.out.println("矩形底的体积" + pillar.getVolume());

    }

}

总结:面向抽象编程目的是为了应对用户需求的变化,将某个类中经常因需求变化而需要改变的代码从类中分离出去。其核心是让类中每种可能的变化对应的交给抽象类的一个子类去负责,从而让该类的设计者不去关心具体的实现,避免所设计的类依赖于具体的实现。

关于抽象类:对于抽象类不能用new创建该类的对象,但可以成为其子类的上转型对象,从而该对象可以调用子类重写的方法。

一个非抽象类是某个抽象类的子类,那么它必须重写父类的抽象方法,给出方法体。

时间: 2025-01-07 01:38:44

java--面向抽象编程的相关文章

java面向抽象编程,可以让程序员专注于程序的逻辑结构设计

/* *建立的抽象类,把这个抽象类交给别人,别人的类需要继承该抽象类 *求得一个立体的底面积,但是我们可以不用管别人是怎么这个底面积的. */ package com.pan.e1; /** * * 作者:属于雨灵的夜 */ public abstract class Gemetry { public abstract double getArea(); } 因为我们希望代码能实现各种类型的体积,所以我们把需要经常变化的底面积作为抽象类,让它作为它的子类的上转类型. /* *面向抽像类,设计主体

java面向抽象编程样例

import java.util.*; abstract class Geometry{    public abstract double getArea();    }  class Pillar{    Geometry bottom;    double height;    Pillar(Geometry bottom ,double height){        this.bottom=bottom;        this.height=height;            } 

java 面向抽象编程的思想

SIM.java public abstract class SIM { public abstract void setNumber(String n); public abstract String giveNumber(); public abstract String giveCorpName(); } MobileTelephone.java public class MobileTelephone { SIM card; public void useSIM(SIM card) {

java面向切面编程

面向切面在英文中的单词是Aspect Oriented Programming(AOP),在spring框架中叫aop,它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术.它是一种新的方法论,它是对传统OOP编程的一种补充. AOP技术是建立在Java语言的反射机制与动态代理机制之上的.请看下图 以上图是利用jdk动态代理为真实对象上的每个方法上加上日志功能.从这张图中可以看出,我们是面向真实对象上的方法编程,把方法切开,在执行方法之前做了日志功能.

Java 面向切面编程 AOP

本文内容 实例 引入 原始方法 装饰者模式 JDK 动态代理和 cglib 代理 直接使用 AOP 框架 下载 demo 实例 引入 package com.cap.aop;   public interface ICalculator { public double add(double num1, double num2) throws Exception;   public double sub(double num1, double num2) throws Exception;   p

java面向接口编程

在oop中有一种设计原则是面向接口编程,面向接口编程有非常多优点,详细百度一大片.我来谈一下详细的使用中的一些不成熟的见解.! 首先面向接口编程能够消除类之间的依赖关系,使得业务仅仅依赖接口. 这样有什么优点呢? 这种优点大大的.比方说我们声明一个car的接口.我们对车有下面行为,我们能够开车.洗车,推车,修车,拆车等等, 详细用代码实现: package com.panther.dong.faceinterface; /** * Created by panther on 15-8-9. */

Java——面向切面编程,Spring中的AOP编程

面向切面编程 AOP思想:将横向重复代码,纵向抽取出来 AOP体现--Filter AOP体现--拦截器 AOP体现--动态代理 Spring中实现AOP思想 原理:Spring可以为容器中管理的对象生成代理对象 代理分为动态代理和cglib代理: 动态代理(优先) 被代理对象必须要实现接口,才能产生代理对象,如果没有接口将不能使用动态代理技术,换句话说,就是代理对象和被代理要实现同一接口 cglib代理 第三方代理技术,cglib代理,可以对任何类生成代理,代理的原理是对目标对象进行继承代理,

java面向切面编程总结-面向切面的本质

面向切面的本质:定义切面类并将切面类的功能织入到目标类中: 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Before, @AfterReturning,@After,@AfterThrowing,@Around). https://www.cnblogs.com/oumyye/p/4480196.html 现将图6-6中涉及到的一些概念解释如下. 切面(Aspect): 其实就是共有功能的实现.如日志切面.权限切面.事务切面等.在实际应用中通常是一

java 面向接口编程

Advertisement.java public interface Advertisement { //接口 public void showAdvertisement(); public String getCorpName(); } AdvertisementBoard.java public class AdvertisementBoard { //负责创建广告牌 public void show(Advertisement adver) { System.out.println(ad

java面向对象化编程1---类

类的概念 一个类可以继承其它类的一切 例: class Employee { String name; int age; float salary;}class Manager extends Employee{ String deparentName; int deparentNumber;} public class test2{ public static void main(String args[]) { Manager e=new Manager(); e.name="张旭"