《SICP》之抽象屏障

      我们在对数据进行抽象的时候,基本思想就是为每一类数据对象标识出一组操作,使得对这类数据对象的所有操作都可以基于它们表述,而且在操作这些数据对象时也只使用它们。

     在我们面对一个复杂数据对象的时候,它对外提供的各种操作又是基于另一个数据对象的一些操作,这个时候我们就需要在数据抽象的时候构建一个“抽象屏障”,它可以隔离系统中不同的层次,把使用数据抽象的程序与实现数据抽象的程序分开,也就是所谓的面向抽象编程,

举个例子,
我们需要表示一个有理数,很自然想到, 需要一个分子,一个分母,一个构造函数把分子,分母填进去。
public class RationalNumber {
    private final int numer;
    private final int denom;

    public RationalNumber(int numer,int denom) {
        this.numer = numer;
        this.denom = denom;
    }
}


对于外部程序来说,它们根本就不需要知道你的分子,分母,它们需要的是,你能够加、减、乘、除。因此,我们在抽像数据的时候还需要能够提供addRationalNumber,subRationalNumber,mulRationalNumber,divRationalNumber这样的操作.而外部也只能通过有理数暴露的这些API操作有理数。这些API操作转而又完全是基于有理数的构造函数,分子,分母实现,构造函数,分子,分母的实现又基于其底层构造函数,基本类型数据的实现。因此一个有理数的数据可以形成如下的抽象结构

-------------使用有理数的程序----------------------

-------------问题域中的有理数----------------------

-------------作为分子分母的有理数------------------

-------------实现有理数的构造函数,分子,分母---------

这每一层面都是一个抽象屏障,当我们进行了这样的抽象层次分离之后,以后的维护就方便很多了,

猜你喜欢

转载自ningandjiao.iteye.com/blog/1554851