美文网首页
OO中的hook到底是什么

OO中的hook到底是什么

作者: kid551 | 来源:发表于2018-10-22 00:32 被阅读0次

在面向对象的设计中,会遇到很多代码库写到hook(钩子)这个东西。对新手来讲,明白hook是什么很重要,它意味着更加精细的“隔离”设计,而不是粗放地直接做继承。

在Thinking in Java中,谈到Iterator的时候提出了一个问题:如果某个方法需要去一个个地处理一堆元素,直接继承Collection和还是实现Iterator好用一点呢?

直观来看,直接继承Collection是一个方便的选择。

class InterfaceVsIterator {
    public static void display(Iterator<Pet> it) {
        while (it.hasNext()) {
            Pet p = it.next();
            System.out.println(p.id() + ":" + p + " ");
        }
    }
    
    public static void display(Collection<Pet> pets) {
        for (Pet pet : pets) {
            System.out.println(p.id() + ":" + p + " ");
        }
        System.out.println();
    }
}

这里的InterfaceVsIterator其实是一个消费者,专门消费提供的Collection或者Iterator。那么,消费哪一种东西会让你的代码变得更加灵活呢?

如果是直接继承AbstractCollection则需要实现size()iterator()方法,例如:

class CollectionSequence extends AbstractCollection<Pet> {
    
    private Pet[] pets = Pets.createArray(8);

    @Override
    public Iterator<Pet> iterator() {
        return new Iterator<Pet>() {
            private int index = 0;
            
            public boolean hasNext() {
                return index < pets.length;
            }

            public Pet next() {
                return pets[index++];
            }
            
        };
    }

    @Override
    public int size() {
        return pets.length;
    }
    
}

不仅是要实现display()用不到的size()方法,并且同时需要提供Iterator的一个实例。

另一方面,Java的语法是不支持多重继承的。所以,如果你的类已经继承了某个别的不同于AbstractCollection的类,则它就无法再去继承AbstractCollection了。而接口则是可以实现多个。

class PetSequence {
    protected Pet[] pets = new Pet[] {new Pet(), new Pet()};
}

public class NonCollectionSequence extends PetSequence {
    
    public Iterator<Pet> iterator() {
        return new Iterator<Pet>() {
            private int index = 0;
            public boolean hasNext() {
                return index < pets.length;
            }

            public Pet next() {
                return pets[index++];
            }
            
        };
    }
    
    public static void main(String[] args) {
        NonCollectionSequence nc = new NonCollectionSequence();
        InterfaceVsIterator.display(nc.iterator());
    }
}

使用Iterator有更多的灵活性,本质上它体现了Interface在Java中的灵活性。Interface可以将真正被使用于business logic的部分最小化,不必实现非业务的多余部分。另一方面,由于可以实现多个Interface,它可以为已有的组件提供更多的功能。

这里,这个被复用的部分就是hook。

总结起来,Interface更像是一个强制实现某个方法的工具。有了它,就可以在语法层级强制实现某个方法,从而保证了hook上达成一致。

相关文章

  • OO中的hook到底是什么

    在面向对象的设计中,会遇到很多代码库写到hook(钩子)这个东西。对新手来讲,明白hook是什么很重要,它意味着更...

  • Small StarC Unit 7 Lesson 6

    英孚家长: 您好! 1.学习自然拼读法OO的发音,如:book,cook,foot,hook,room,spoon...

  • react hook介绍

    react hook是什么 react hook是react中引入新特性,它可以让react函数组件也拥有状态;通...

  • React hook 10种 Hook

    React hook 10种 Hook (详细介绍及使用) React Hook是什么?React官网是这么介绍的...

  • useState Hook

    前言问题:Hook 是什么? 一个 Hook 就是一个特殊的函数,让你在函数组件中获取状态等 React 特性使用...

  • 什么是Hook

    Hook是什么? Hook 又叫“钩子”,它可以在事件传送的过程中截获并监控事件的传输,将自身的代码与系统方法进行...

  • OO CSS 学习

    OO CSS 的概念 OO CSS 是什么?简单一句话就是面向对象的CSS。OO CSS 将页面可重用元素抽象成一...

  • Hook

    Hook 是什么?Hook 是一个特殊的函数,它可以让你“钩入” React 的特性。 什么时候用 Hook?使用...

  • Vue3中的Composables组合式函数,Vue3实现min

    Vue3中的Composables是什么Vue3中的Composables 简单理解其实就是类React Hook...

  • 615

    (*’(OO)’*)(*’(OO)’*)(*’(OO)’*)(*’(OO)’*)(*’(OO)’*)(*’(OO)...

网友评论

      本文标题:OO中的hook到底是什么

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