设计模式-模板方法设计模式

设计模式-模板方法设计模式

设计模式:

	设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格以及解决问题的思考方式,设计模式免去了我们自己再去思考和摸索。就像经典的棋谱,对于不同的棋局我们使用不同的棋谱。

	创建型模式:工厂方法模式  抽象工厂模式  单例模式   建造者模式  原型模式

	结构型模式: 适配器模式   装饰器模式   代理模式    外观模式    桥接模式   组合模式   享元模式

	行为型模式:策略模式  模板方法模式  观察者模式  迭代子模式  责任链模式  命令模式  备忘录模式  状态模式   访问者模式  中介者模式  解释器模式

模板方法设计模式:

​ 抽象类体现的是一种模板设计模式,抽象类作为多个子类的通用模板,子类在抽象类的基础上再进行扩展、改造,但是子类总体上会保留抽象类的行为方法(抽象方法)。

解决的问题:

​ 当功能内部一部分是确定的,一部分实现是不确定的,这时候可以把不确定的暴露出去,让子类去实现。换一句话说-------在软件开发实现一个算法的时候,整体的步骤虽然很固定、通用,这些步骤已经在父类中写好了。但是某些部分易变,易变部分可以抽象出来,供不同的子类去实现,这就是一种模板模式。

package com.geng;

public abstract class TemplateTest {
    public long spendTime() throws InterruptedException {
        long startTime=System.currentTimeMillis();
        //上半部分和下半部分都是比较确定的代码,只有执行的函数是不确定的,所以我们可以将他设置为抽象方法,让子类去实现
        code();
        long endTime= System.currentTimeMillis();
        return endTime-startTime;
    }

    public abstract void code() throws InterruptedException;

}
class SubTempalteTest extends TemplateTest{
    @Override
    public void code() throws InterruptedException {
        for(int i=1;i<1001;i++){
            boolean flag=false;
            for(int j=2;j<Math.sqrt(i*1.0);j++){
                if(i%j==0){
                    flag=true;
                    break;
                }
            }
            if(!flag){
                System.out.println(i);
            }
        }
        Thread.sleep(20);
    }



    public static void main(String[] args) throws InterruptedException {
        SubTempalteTest subTempalteTest=new SubTempalteTest();
        System.out.println(subTempalteTest.spendTime());
    }
}
package com.geng;

public abstract class TemplateTest {
    public void first(){
        System.out.println("执行第一步");
    }
    public void third(){
        System.out.println("执行第三步");
    }
    public abstract void second();
    public final void total(){
        this.first();
        second();
        this.third();
    }
}
class SubTempalteTest1 extends TemplateTest{

    @Override
    public void second() {
        System.out.println("我是一号");
    }
}
class SubTempalteTest2 extends TemplateTest{

    @Override
    public void second() {
        System.out.println("我是二号");
    }
}
class test{
    public static void main(String[] args){
        SubTempalteTest1 subTempalteTest1=new SubTempalteTest1();
        SubTempalteTest2 subTempalteTest2=new SubTempalteTest2();
        subTempalteTest1.total();
        subTempalteTest2.total();
    }
}
posted on 2021-09-17 14:27  gyp666  阅读(36)  评论(0)    收藏  举报