Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1997233
  • 博文数量: 1647
  • 博客积分: 80000
  • 博客等级: 元帅
  • 技术积分: 9980
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 15:15
文章分类

全部博文(1647)

文章存档

2011年(1)

2008年(1646)

我的朋友

分类:

2008-10-28 18:17:15

    //定义一个接口
    interface Incrementable...{
        void increment();
    }

    //一个简单的接口实现类
    class Callee1 implements Incrementable...{
        private int i = 0;
        public void increment()...{
            i++;
            System.out.println (i);
        }


    }

    class MyIncrement...{
        void increment()...{
            System.out.println ("other operator");
        }

        static void f(MyIncrement mi)
        ...{
            mi.increment();

        }
    }


    //Callee2 想改变 MyIncrement中 increment()方法的行为。
    // 主要是因为Callee2有一个完全不同的incr ()方法
    // 要解决的问题是在调用increment 方法的时候 改而调用 incr方法
    //父类有一个increment 不能因为字类的用途而覆盖这个方法
    //所以字类重新写了一个 incr 方法。

    class Callee2 extends MyIncrement...{
        private int i = 0;
        //一个用来替代incrment方法的行为的方法。
        private void incr()...{
            i++;
            System.out.println (i);
        }
        //内部类实现Incrementable接口
        private class Closure implements Incrementable ...{
            public void increment()...{
                incr();
            }
        }

        //获得一个回调的引用
        Incrementable getCallBackReference()...{
            return new Closure();
        }


    }

    class Caller...{
        private Incrementable callbackReferences;

        //它只需要一个接口。
        Caller (Incrementable chb)...{
            callbackReferences = chb;
        }

        void go()...{
            callbackReferences.increment();
        }


    }

     class Callbacks...{
        public static void main(String[] args)...{
            Callee1 c1 = new Callee1();
            Callee2 c2 = new Callee2();

            MyIncrement.f(c2);

 

            Caller caller1 = new Caller(c1);
            //客户端完全不知道 caller2 中的incrment方法的实现。
            //事实上Callee2完全改变了incrment方法的行为(调用了另一个方法)
            Caller caller2  = new Caller(c2.getCallBackReference());

            caller1.go();
            caller1.go();

            caller2.go();
            caller2.go();
        }
    }
    //回调的价值在于它的灵活性--在运行时决定调用哪个方法。

【责编:Ken】

--------------------next---------------------

阅读(189) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~