美文网首页
3.模板方法

3.模板方法

作者: _少年不知愁 | 来源:发表于2020-03-19 10:57 被阅读0次

    1.模板模式

    定义

    是类的行为模式,
    在一个方法定义骨架方法,部分逻辑可以以具体的方法实现,然后将部分方法可以延迟到子类中,不同子类对具体方法不同实现

    该设计模式实现超级简单,完美运用了java的继承机制
    参考代码实现

    优点
    封装不变部分,扩展可变部分
    提取公共部分代码,便于维护
    行为由父类控制,子类实现

    缺点
    子类影响父类
    模板方法使用继承方式复用代码,如果要在基本算法里面增加一个步骤,而该步骤是抽象的话,每个子类都要修改代码,实现这个步骤

    使用场景
    多个子类有公有的方法,并且逻辑基本相同时。
    重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个
    重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通
    过 钩子函数约束其行为

    钩子函数
    是对于抽象方法或者接口中定义的方法的一个空实现,子类实现对部分方法控制是否调用
    见代码实现

    代码

    /**
     * 抽象 父类
     *
     * @author summit
     * @since 2020/3/19 10:13
     */
    public abstract class ParentAbstract {
    
        /**
         * 骨架方法
         */
        public void myMethod() {
            if ((onOff())) {
                hook();
            }
            say();
        }
    
        public void hook() {
            System.out.println("hook 开启");
        }
    
        /**
         * 钩子控制
         */
        public Boolean onOff() {
            System.out.println("默认开启");
            return true;
        }
    
        public void say() {
            System.out.println("父类-say-method");
        }
    
    }
    
    /**
     * 子类实现
     *
     * @author summit
     * @since 2020/3/19 10:15
     */
    public class SubClazz extends ParentAbstract {
    
        // @Override
        // public Boolean onOff() {
        //     return false;
        // }
    
        @Override
        public void say() {
            System.out.println("子类-say-method");
        }
    
    
        public static void main(String[] args) {
            SubClazz subClazz = new SubClazz();
            subClazz.myMethod();
        }
    }
    

    lambda表达式实现

    由于每次都要创建子类,会造成系统更加庞大

    /**
     * @author summit
     * @since 2020/3/19 10:32
     *
     * @see java.util.function.Predicate
     */
    public interface MyTest<T> {
    
        boolean test(T t);
    
        default List<String> filterStr(List<String> stringList, MyTest<String> myTest) {
            List<String> myStrings = new ArrayList<>();
            for (String str : stringList) {
                if (myTest.test(str)) {
                    myStrings.add(str);
                }
            }
            return myStrings;
        }
    
    }
    
    
    /**
     * @author summit
     * @since 2020/3/19 10:40
     */
    public class MyTestImpl implements MyTest<String> {
    
        @Override
        public boolean test(String s) {
            return s.length() > 2;
        }
    
        public static void main(String[] args) {
            List<String> stringList = Arrays.asList("a", "bb", "ccc","dddd");
            MyTest<String> myTest = new MyTestImpl();
            System.out.println( myTest.filterStr(stringList,myTest));
            System.out.println(myTest.filterStr(stringList, (e) -> e.length() > 3));
        }
    }
    
    

    相关文章

      网友评论

          本文标题:3.模板方法

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