zoukankan      html  css  js  c++  java
  • 《疯狂Java讲义精粹》读书笔记10 闭包(Closure) 和回调

    ==================《疯狂Java讲义精粹》读书笔记10 ------  闭包(Closure) 和回调========================

      闭包是一种能背调用的对象,他保存了创建它的作用的信息,Java中可以把非静态内部类当成面向对象领域的闭包。

      回调就是某个方法一旦获得内部内对象的引用后,就可以在合适的时候反过来调用外部类的实例方法

     

      假设有这样的一个场景:
        一个人,首先他是一个程序员,他的工作是敲代码。但是他除了是以为程序员之外,他还是一名教师,他的工作还可以在讲台上讲课。
      那么怎么来实现这个场景呢?
      首先,我们可以定义两个类(或者接口),分别叫Teacher 和 Programmer ; 然后定义另一个类叫TeacherProgrammer,这个类继承了Teacher和Programmer,可以使用一个内部类通过闭包和回调来实现两种不同的工作方式。

      下面是一种实现的方式:

    /**
     * 闭包和回调
     * @author 《疯狂的Java讲义精粹》
     *
     */
    
    /**
     * Teacher接口
     */
    interface Teacher{
        void work();
    }
    
    /**
     * Programmer 类
     */
    class Programmer{
        private String name;
        
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
        public Programmer(){}
        public Programmer(String name){
            this.name = name;
        }
        
        public void work(){
            System.out.println(getName() + "在灯下认真敲代码、、、、、");
        }
    }
    
    /**
     * TeacherProgrammer 继承了Programmer类
     * 在内部使用内部内实现回调外部类的方法teach()
     */
    public class TeacherProgrammer extends Programmer{
        public TeacherProgrammer(){}
        public TeacherProgrammer(String name){
            super(name);
        }
        
        //教学工作依然由TeacherProgrammer类定义
        private void teach(){
            System.out.println(getName()+ "教师在讲台上讲解、、、、、、");
        }
        
        private class Closure implements Teacher{
            public void work(){
                teach();//闭包
            }
        }
        
        //返回一个非静态内部类的引用,允许外部类通过该非静态内部类引用来回调外部类的方法
        public Teacher getCallbackReference(){
            return new Closure();
        }
        
        public static void main(String[] args) {
            TeacherProgrammer tp = new TeacherProgrammer("CocoonFan");
            tp.work();//调用Programmer的work()方法
            tp.getCallbackReference().work();//调用Teacher类的work()方法
        }
    }


    输出结果:

    CocoonFan在灯下认真敲代码、、、、、
    CocoonFan教师在讲台上讲解、、、、、、
  • 相关阅读:
    AtomicInteger
    Android利用ViewPager实现滑动广告板
    modelsim实用教程--前言
    信号的抽取和插值
    FPGA与simulink联合实时环路系列——实验三 按键key
    FPGA与simulink联合实时环路系列——实验二LED
    FPGA与simulink联合实时环路系列——实验一 测试
    FPGA与simulink联合实时环路系列—开篇
    格雷码原理与Verilog实现
    基于FPGA的飞机的小游戏
  • 原文地址:https://www.cnblogs.com/CocoonFan/p/2952264.html
Copyright © 2011-2022 走看看