zoukankan      html  css  js  c++  java
  • 模版方法模式(Template Method)

    1、概念

    在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
    图片
    2、模式结构

    • 抽象类(AbstractClass): 定义一组基本方法供子类实现,定义并实现组合了基本方法的模板方法
    • 具体子类 (ConcreteClass):  实现原语操作以完成算法中与特定子类相关的步骤。

    3、使用场景

    • 当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现
    • 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能由各个子类实现
    • 控制子类扩展;模板方法只在特定点调用“ hook”操作 ,这样就只允许在这些点进行扩展

    4、优缺点

    优点:

    • 封装不变部分,扩展可变部分
    • 一种代码复用的基本技术。它们在类库中尤为重要,它们提取了类库中的公共行为,便于维护
    • 有框架控制如何做事情,而由使用框架的人指定框架算法中每个步骤的细节,实现控制反转原则

    缺点:

    • 每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象

    5、实例

    首先定义开门的的抽象类,openDoor为开门的公用方法,但开锁有多种方式,setNeedUnLock为钩子方法,可由子类控制是否需要开锁

    public abstract class AbsUnlock {
        private boolean isNeedUnlock = true;
    
        protected abstract void unlockAction();
    
        public void setNeedUnlock(boolean needUnlock) {
            isNeedUnlock = needUnlock;
        }
    
        public final void openDoor() {
            if (isNeedUnlock) {
                unlockAction();
            }
            // 其它处理逻辑
        }
    }
    

    磁卡开锁类

    public class CardUnlock extends AbsUnlock {
    
        @Override
        protected void unlockAction() {
            // 磁卡开锁逻辑
        }
    }
    

    密码开锁类

    public class PasswordUnlock extends AbsUnlock {
    
        @Override
        protected void unlockAction() {
            // 密码开锁逻辑
        }
    }
    

    客户端调用

    public static void main(String[] args) {
        CardUnlock card = new CardUnlock();
        card.openDoor();
    
        PasswordUnlock pwd = new PasswordUnlock();
        pwd.openDoor();
    }
    
  • 相关阅读:
    Linux下Tomcat重新启动
    Navicat远程连接不上mysql解决方案
    Tomcat 启动时 SecureRandom 非常慢解决办法,亲测有效
    SpringMVC Controller接收参数总结
    maven source 1.3 中不支持泛型 解决办法
    css background-image 自适应宽高——转载
    IntellIJ IDEA 配置 Maven 以及 修改 默认 Repository
    使用Idea从github上获取项目
    取消IDEA默认打开最近的项目(设置打开选择创建页面)
    GameFreamWork框架----事件系统的应用
  • 原文地址:https://www.cnblogs.com/fomin/p/9981872.html
Copyright © 2011-2022 走看看