zoukankan      html  css  js  c++  java
  • 模板方法模式(下)

    同步回调callBack 通过B复用,A扩展实现类似模板模式的功能
    package com.lf.pattern.callback;
    
    public interface ICallback {
    
        void methodToCallback();
    
    }
    package com.lf.pattern.callback;
    
    public class BClass {
        //可以复用
        public void process(ICallback callback) {
            //...xxx()
            System.out.println("B begin.");
            callback.methodToCallback();
            //...xxx()
            System.out.println("B end.");
        }
    }
    package com.lf.pattern.callback;
    
    /**
     * 同步回调callBack 通过B复用,A扩展实现类似模板模式的功能
     */
    public class AClass implements ICallback{
    
        public static void main(String[] args) {
            BClass b = new BClass();
            b.process(new ICallback() { //回调对象
                @Override
                public void methodToCallback() {
                    System.out.println("Call back me.");
                }
            });
            b.process(new AClass());
        }
    
        //A 定制代码
        @Override
        public void methodToCallback() {
            System.out.println("Im A duixiang.");
        }
    }

    模板模式 VS 回调

    从应用场景上来看,同步回调跟模板模式几乎一致。它们都是在一个大的算法骨架中,自由替换其中的某个步骤,起到代码复用和扩展的目的。而异步回调跟模板模式有较大差别,更像是观察者模式。

    从代码实现上来看,回调和模板模式完全不同。回调基于组合关系来实现,把一个对象传递给另一个对象,是一种对象之间的关系;模板模式基于继承关系来实现,子类重写父类的抽象方法,是一种类之间的关系。

    组合优于继承。实际上,这里也不例外。在代码实现上,回调相对于模板模式会更加灵活,主要体现在下面几点。

      1.像 Java 这种只支持单继承的语言,基于模板模式编写的子类,已经继承了一个父类,不再具有继承的能力。

      2.回调可以使用匿名类来创建回调对象,可以不用事先定义类;而模板模式针对不同的实现都要定义不同的子类。

      3.如果某个类中定义了多个模板方法,每个方法都有对应的抽象方法,那即便我们只用到其中的一个模板方法,子类也必须实现所有的抽象方法。而回调就更加灵活,我们只需要往用到的模板方法中注入回调对象即可。

  • 相关阅读:
    iOS开发常见错误(转)
    SVN各种错误提示产生原因及处理方法大全(转)
    SVN常见问题(转)
    iPhone6 Plus、iPhone6、iPhone5S和之前版本真实分辨率
    各类 HTTP 返回状态代码详解(转)
    js:全局作用域和调整浏览器窗口大小
    python之制作模块
    python之模块time | strftime || 模块datetime | timedelta | 计算3天前的日期
    python之模块 sys | os
    python之正则表达式 | match | split | findall | sub替换 |
  • 原文地址:https://www.cnblogs.com/flgb/p/14813067.html
Copyright © 2011-2022 走看看