zoukankan      html  css  js  c++  java
  • java模式之-模板方法模式

    模板方法模式是java设计模式常见的模式之一。

    《JAVA与模式》中写道:

    模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。

    下面是自己写的小demo,便于理解模板方法模式。

    1.父类

    package com.westward;
    
    public abstract class GoToCity {
        /**
         * 模板方法,必须定义为public final的。子类能够使用,但不能复写
         * 子类都有相同的步骤,但是有些步骤有不同的实现。
         * */
        public final void go(){
            closeDoor();
            if (isLock()) {
                getLock();
            }
            leaveHome();
            onTheWay();
            arrive();
        }
    
        /**
         * 不同子类不同的行为,将行为延迟到子类实现
         * */
        protected abstract void arrive();
    
        /**
         * 不同子类不同的行为,将行为延迟到子类实现
         * */
        protected abstract void onTheWay();
    
        /**
         * 共有的行为,在基类实现,并对子类隐藏
         * */
        private void leaveHome() {
            System.out.println("离开家");
        }
    
        /**
         * 共有的行为,在基类实现,并对子类隐藏
         * */
        private void closeDoor() {
            System.out.println("关闭家门");
        } 
        
        /**
         * 共有的行为,在基类实现,并对子类隐藏
         * 有些子类执行,有些不执行。所以用到了钩子方法
         * */
        private void getLock(){
            System.out.println("上锁");
        }
        
        /**
         * 钩子方法,用来决定一些方法是否执行
         * 子类可以复写此方法,来决定是否执行某方法
         * */
        protected  boolean isLock(){
            return true;
        }
    }

    2 子类

    package com.westward;
    
    public class GoToBeijing extends GoToCity {
    
        @Override
        protected void arrive() {
            System.out.println("到达目的地:北京");
        }
    
        @Override
        protected void onTheWay() {
            System.out.println("坐火车");
        }
        
    }
    package com.westward;
    
    public class GoToShanghai extends GoToCity {
    
        @Override
        protected void arrive() {
            System.out.println("到达目的地:上海");
        }
    
        @Override
        protected void onTheWay() {
            System.out.println("坐飞机");
        }
        
        @Override
        protected boolean isLock() {
            
            return false;
        }
    
    }

    测试类:我是采用的Junit4单元测试

    package com.westward;
    
    import static org.junit.Assert.*;
    
    import org.junit.Test;
    
    public class TemplateMethodTest {
    
        @Test
        public void test() {
            GoToCity go1= new GoToBeijing();
            GoToCity go2= new GoToShanghai();
            go1.go();
            System.out.println("
    ");
            go2.go();
        }
    
    }

    output:

    关闭家门
    上锁
    离开家
    坐火车
    到达目的地:北京


    关闭家门
    离开家
    坐飞机
    到达目的地:上海

  • 相关阅读:
    img 的data-src 属性及懒加载
    try catch 用法
    input 的各种属性的验证 checkValidity兼容性
    表单提交的方法。
    通信原理
    计算机组成原理
    CREC 2017
    POJ 1201 Intervals
    HDU 3440 House Man
    poj 3169 Layout
  • 原文地址:https://www.cnblogs.com/westward/p/5461327.html
Copyright © 2011-2022 走看看