设计模式

设计模式就是前人将自己编写代码的经验总结出来,通过代码的逻辑编写符合大多数场景的业务开发的硬编码。就是一个通用的解决方案。是一种问题解决的思路,不是固定的写法。

设计模式的分类

创建型:解决对象的创建问题
行为型:该模式是与方法,行为,算法有关的设计模式
结构型:更多类,更多的对象组合成更大的结构解决某个特定的问题

适配器设计模式

当接口有多个方法,而其实现类只需要其中几个方法的时候,实现类如果直接实现该接口,
需要重写接口中全部的方法,此时,只要创建一个抽象类,实现该接口全部方法,实现类并不直接实现接口,
而是继承这个抽象类,就只需要重写自己需要的方法就行,这个抽象类也叫适配器类,
通过这种间接实现的方法,整体代码更加高效,整洁

Sun公司为了程序员方便实现servlet接口,已经写好了适配器类,GenericServlet类,
并提供了无参init方法,用于提供给子类重写,这个无参的init方法将在有参的init方法中被调用,
避免直接重写有参init方法造成config赋值为null问题

模板方法设计模式

个人理解是,抽取子类中的执行逻辑,控制子类的执行流程,统一交给父类管理,
具体实现仍然交给子类实现,这个父类就叫做模板类,统一控制子类执行流程的方法就叫做模板方法。
Servlet规范中,HttpServlet就是典型的模板类,其中的service方法就是模板方法。
HttpServlet类中doGet,doPost方法执行流程被service方法控制,子类重写doGet,doPost方法,
若重写doPost方法,用户提交方式为Get,会在父类中报错405,用户提交方式为Post,
则执行子类重写的doPost方法,达到控制用户提交方式的效果。

模板方法设计模式示例

不使用模板类
public class NoUseTemplateStudent {
    public void day(){
        System.out.println("学生-起床");
        System.out.println("学生-上课");
        System.out.println("学生-下课");
        System.out.println("学生-睡觉");
    }
}
public class NoUseTemplateWorker {
    public void day(){
        System.out.println("工人-起床");
        System.out.println("工人-上班");
        System.out.println("工人-下班");
        System.out.println("工人-睡觉");
    }
}
public class Test {
    public static void main(String[] args) {
        NoUseTemplateStudent student = new NoUseTemplateStudent();
        student.day();
        NoUseTemplateWorker worker = new NoUseTemplateWorker();
        worker.day();
    }
}

使用模板方法设计模式
public class UseTemplateSuper {
    //父类中的day是模板方法,定义核心算法骨架,具体实现步骤延迟到子类中完成
    //算法为了受到保护,所以模板方法一般被final修饰
    //核心算法骨架不需要在子类中都写一遍,只在模板方法中写一次就行
    public final void day(){
        getUp();
        goWork();
        backWork();
        sleep();
    }

    //具体的实现步骤之一,具体实现可以在子类中完成
    public void sleep() {}

    public void backWork() {}

    public void goWork() {}

    public void getUp() {}
}

public class UseTemplateWorker extends UseTemplateSuper {
    @Override
    public void sleep() {System.out.println("工人-睡觉");}

    @Override
    public void backWork() {System.out.println("工人-下班");}

    @Override
    public void goWork() {System.out.println("工人-上班");}

    @Override
    public void getUp() {System.out.println("工人-起床");}
}

public class UseTemplateStudent extends UseTemplateSuper {
    @Override
    public void sleep() {System.out.println("学生-睡觉");}

    @Override
    public void backWork() {System.out.println("学生-下课");}

    @Override
    public void goWork() {System.out.println("学生-上课");}

    @Override
    public void getUp() {System.out.println("学生-起床");}
}

public class Test {
    public static void main(String[] args) {
        UseTemplateSuper student = new UseTemplateStudent();
        student.day();
        UseTemplateSuper worker = new UseTemplateWorker();
        worker.day();
    }
}