栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

模板设计模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

模板设计模式

是什么

模板设计模式是比较简单,也容易理解的,简单来讲,就是一个事情的完成,要分为多个步骤来进行,但是不同的实现类,有不同的实现过程,可以自己去实现,但是步骤的顺序不能变

举个例子:
比如说,做饭,要经过三个步骤:
1.买菜
2.炒菜
3.端上餐桌

那这个1、2、3顺序是不可以变的,但是不同的人,
买菜的方式不同,有些人是网上下单购买,有些人是自己线下购买
炒菜:有些人是电磁炉炒菜,有些人是煤气灶炒菜
所以,模板设计模式,其实就是在父类中,规定了一个功能的先后步骤,但是具体每个步骤怎么实现,有子类去实现,如果某一个步骤是公用的,那可以放在父类实现

换算到我们框架中对模板设计模式的使用,AQS就是一个典型的模板设计模式

java.util.concurrent.locks.AbstractQueuedSynchronizer#acquire
public final void acquire(int arg) {
  if (!tryAcquire(arg) &&
        acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
        selfInterrupt();
}

上面这个方法是reentrantLock加锁时,调用的一个方法,可以看到,aqs规定了,在加锁的时候,
1、需要先执行尝试加锁的步骤,加锁成功,就结束
2、如果没有加锁成功,就去排队

这就是aqs抽象的父类方法,不管是哪个类,集成了AQS去加锁的时候,都是这个执行顺序,只是,对于公平锁、非公平锁在尝试加锁的时候(tryAcquire),可能有不同的逻辑,那就在自己的实现类中去实现就可以了

因为代码比较多,就不贴代码了,可以去jdk源码中看下

怎么用
public abstract class AbstractParent {

    public void test() {
        A();
        B();
        if (isBuild()) {
            C();
        }
    }

    abstract void A();

    abstract void B();

    public void C() {
        System.out.println("这是C方法");
    }

    public boolean isBuild() {
        return true;
    }
}


public class Test01 extends AbstractParent {

    @Override
    public void A() {
        System.out.println("test01的A方法");
    }

    @Override
    void B() {
        System.out.println("test01的B方法");
    }

    @Override
    public void C() {
        System.out.println("这是test01的C()方法");
    }
}


public class Test02 extends AbstractParent {
    @Override
    public void A() {
        System.out.println("test02的A方法");
    }

    @Override
    void B() {
        System.out.println("test02的B方法");
    }
}



public class TemplateTest {
    public static void main(String[] args) {
        AbstractParent abstractParent = new Test01();
        AbstractParent abstractParent1 = new Test02();

        abstractParent.isBuild();

        abstractParent.test();
        System.out.println("");
        abstractParent1.test();
    }
}

上面这个就是我自己写的demo

总结

个人感觉模板设计模式,可以将所有子类通用的逻辑沉淀在父类中,对于每个子类都不一样的方法,放在各个子类去实现,这样可以避免一部分重复的代码

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/606530.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号