become who you want to b|

张三Blog

园龄:3年4个月粉丝:3关注:0

设计模式-模板模式及模板模式的应用场景及Java对模板方法的使用

1.什么是模板模式

模板模式是在一个抽象类中定义了执行它的方法的方式(模板方法),由抽象类的子类根据具体的业务需求去重写父类的中方法,但执行时将调用抽象类中定义的方式进行。

在模板模式中,一个抽象的公开定义了执行它的方法的方式(模板)。它的子类可以重写方法实现,但调用将以抽象类中定义的方法进行。这种类型的设计模式属于行为型模式

2.模板模式的优点/缺点和使用场景

2.1 模板模式的优点

  • 通过把子类中不变的部分抽离到子类中,从而达到去除子类方法的重复代码便于维护
  • 扩展可变部分,子类实现模板父类的某些细节,有助于模板父类的扩展
  • 通过一个父类调用子类实现的操作,通过子类扩展增加新的行为(行为由父类控制,子类实现 符合开闭原则)

2.2 模板模式的缺点

  • 按照设计习惯,抽象类负责声明最抽象、最一般的事物属性和方法,实现类负责完成具体的事务属性和方法,但是模板方式正好相反,子类执行的结果影响了父类的结果,会增加代码阅读的难度
  • 每个不同的实现都需要一个子类去实现,导致类的个数不断增加,使得系统更为庞大

2.3 模板模式的使用场景

  • 多个子类有共同的方法,且逻辑基本相同
  • 可以把核心的算法和重要的功能设计为模板方法,子类去实现相关细节功能
  • 系统在进行重构或者是功能优化的时候可以将子类重复的代码抽离到父类中

请添加图片描述

3.模板模式实现

3.1 首先创建一个Phone抽象类

package com.zhangsan.shard.pojo;

/**
 * @ClassName Phone
 * @Description TODO
 * @Author ZhangSan_Plus
 * @Date 2021/9/9 19:43
 * @Version 1.0
 **/
public abstract class Phone {
    abstract void openPhone();

    abstract void endPhone();

    abstract void upVolume();

    abstract void downVolume();

    public final void usePhone() {
        //开机
        openPhone();
        //调高音量
        upVolume();
        //调低音量
        downVolume();
    }

    public final void end() {
        //关闭手机
        endPhone();
    }
}

3.2 创建一个小米手机子类

package com.zhangsan.shard.pojo;

/**
 * @ClassName XiaoMi
 * @Description TODO
 * @Author ZhangSan_Plus
 * @Date 2021/9/9 19:47
 * @Version 1.0
 **/
public class XiaoMi extends Phone {
    @Override
    void openPhone() {
        System.out.println("小米手机已开机");
    }

    @Override
    void endPhone() {
        System.out.println("小米手机已关机");
    }

    @Override
    void upVolume() {
        System.out.println("小米手机音量+1");
    }

    @Override
    void downVolume() {
        System.out.println("小米手机音量-1");
    }
}

3.3 创建一个苹果手机子类

package com.zhangsan.shard.pojo;

/**
 * @ClassName Apple
 * @Description TODO
 * @Author ZhangSan_Plus
 * @Date 2021/9/9 19:50
 * @Version 1.0
 **/
public class Apple extends Phone {
    @Override
    void openPhone() {
        System.out.println("苹果手机已开机");
    }

    @Override
    void endPhone() {
        System.out.println("苹果手机已关机");
    }

    @Override
    void upVolume() {
        System.out.println("苹果手机音量+1");
    }

    @Override
    void downVolume() {
        System.out.println("苹果手机音量-1");
    }
}

3.4 创建一个用户来使用手机

package com.zhangsan.shard.pojo;

/**
 * @ClassName TemplateDemo
 * @Description TODO
 * @Author ZhangSan_Plus
 * @Date 2021/9/9 19:51
 * @Version 1.0
 **/
public class TemplateDemo {
    public static void main(String[] args) {
        Phone xiaoMi = new XiaoMi();
        xiaoMi.usePhone();
        xiaoMi.endPhone();
        Phone apple = new Apple();
        apple.usePhone();
        apple.endPhone();
    }
}

在这里插入图片描述

4. 模板方法在Java中的引用

4.1 AbstractList类

public abstract E get(int var1);

4.1.1 ArrayList对get()方法的实现

public E get(int index) {
        rangeCheck(index);

        return elementData(index);
}

4.1.2 SubList对get()方法的实现

public E get(int index) {
        rangeCheck(index);
        checkForComodification();
        return l.get(index+offset);
}

4.2 AbstractMap类

public abstract Set<Entry<K,V>> entrySet();

4.2.1 ConcurrentHashMap对entrySet()的实现

public Set<Map.Entry<K,V>> entrySet() {
        EntrySetView<K,V> es;
        return (es = entrySet) != null ? es : (entrySet = new EntrySetView<K,V>(this));
}

4.2.2 TreeMap对entrySet()的实现

public Set<Map.Entry<K,V>> entrySet() {
        EntrySet es = entrySet;
        return (es != null) ? es : (entrySet = new EntrySet());
}

本文作者:张三Blog

本文链接:https://www.cnblogs.com/zhangsan-plus/p/16503262.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   张三Blog  阅读(235)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起