美文网首页
对象具体还是抽象?

对象具体还是抽象?

作者: fomin | 来源:发表于2019-07-09 23:23 被阅读0次

在开发中,我们经常会把变量设置为私有(private),不想使用者依赖这些变量,但很多程序员也会给对象自动添加get/set方法,将私有变量公之于众。
具体点

public class User {
    private int userId;
    private String userName;
}

抽象点

public interface User {
    int getUserId();

    String getUserName();

    void setUser(int userId, String userName);
}

抽象点优势在于使用者不知道该User信息是如何实现的,并明白无误地呈现了一种数据结构;而具体点暴露了具体实现,即便是私有变量,通过get/set还是会暴露具体实现。
所以隐藏实现不是单单的把变量之间放上一个函数层那么简单。隐藏实现关乎于抽象,类并不简单地用get/set将变量推向外间,而是暴露抽象接口,以便使用者无需了解数据的实现就能操作数据本地。
当然在具体实现中,这种并不是绝对的,对象和数据结构有相关的反对称性。
过程式代码

public class PercentDiscount {
    private float percent;
    private float price;
}


public class ReductionDiscount {
    private float reduction;
    private float price;
}

public class Discount {

    public float getPrice(Object obj) throws NoSuchFieldException {
        if (obj instanceof PercentDiscount) {
            PercentDiscount pd = new PercentDiscount();
            return pd.percent * pd.price;
        } else if (obj instanceof ReductionDiscount) {
            ReductionDiscount rd = new ReductionDiscount();
            return rd.price - rd.reduction;
        } else {
            throw new NoSuchFieldException();
        }

    }
}

多态式代码

public class PercentDiscount implements Discount {
    private float percent;
    private float price;

    @Override
    public float getPrice() {
        return price * percent;
    }
}


public class ReductionDiscount implements Discount {
    private float reduction;
    private float price;

    @Override
    public float getPrice() {
        return price - reduction;
    }
}

public interface Discount {
    float getPrice();
}

我们看到这两种定义的本质是截然对立的。过程式代码便于在不改动既有数据结构的前提下添加新函数,而面向对象代码便于在不改动既有的函数下添加新类。
所以在具体的业务场景在来决定使用哪种方式,需要添加新数据类型而不是新函数的时候可以使用面向对象;需要添加新函数而不是数据类型使用过程式比较合适。一切都是对象只是一个传说。具体的使用方式需要根据当前业务场景来决定。

相关文章

  • 对象具体还是抽象?

    在开发中,我们经常会把变量设置为私有(private),不想使用者依赖这些变量,但很多程序员也会给对象自动添加ge...

  • Scala类和对象

    类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图...

  • Scala编程基础23:Scala类和对象

    类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图...

  • Java 反射 之 动态代理(InvocationHandler

    动态代理: 通过反射的方式调用真实对象的方法静态代理: 真实对象显式地方法调用 这样理解还是很抽象,还是具体实例代...

  • 【Java】【设计模式】工厂模式

    工厂模式 概述:工厂方法中抽象工厂负责定义创建对象的接口,具体对象的创建工作由继承抽象工厂的具体类实现。 优点:客...

  • java中的对于多态的理解

    面向对象: 类:具体的对象抽象而来,可以抽象的表示一类具有相同特征和行为的对象 对象:是由类的实例化而来,对象...

  • 设计模式基础(三)

    工厂方法模式 概述:工厂方法模式中抽象工厂类负责定义创建对象的接口,具体对象的创建工作由继承抽象工厂的具体类实现。...

  • 具体抽象

    概念是从具体事物中抽象出来的观念 概念可能不完全或不准确 学习停留在概念里或者仅通过概念推演可能会偏离真相 自身的...

  • 构造函数和实例的关系

    抽象和具体的关系构造函数:抽象,定义的是一类对象应该具有什么属性,什么 方法,描述规则,描述蓝图。实例:具体,根据...

  • 享元模式(对象共享,避免创建过多的对象)

    Flyweight 享元对象的抽象基类或接口 ConcreteFlyweight 具体的享元对象 Flywight...

网友评论

      本文标题:对象具体还是抽象?

      本文链接:https://www.haomeiwen.com/subject/umyqkctx.html