怎么做好网站营销,nike网站策划与建设,建立团购网站,域名去哪里买经典的设计模式有23种#xff0c;但是常用的设计模式一般情况下不会到一半#xff0c;我们就针对一些常用的设计模式进行一些详细的讲解和分析#xff0c;方便大家更加容易理解和使用设计模式。
1-什么是模板模式 模板模式#xff0c;全称是模板方法设计模式#xff0c;英… 经典的设计模式有23种但是常用的设计模式一般情况下不会到一半我们就针对一些常用的设计模式进行一些详细的讲解和分析方便大家更加容易理解和使用设计模式。
1-什么是模板模式 模板模式全称是模板方法设计模式英文是Template Method Design Pattern。在GoF的《设计模式》一书中它是这么定义的Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.翻译成中文就是模板方法模式在一个方法中定义一个算法骨架并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下重新定义算法中的某些步骤。模板模式主要是用来解决复用和扩展两个问题。 在模板模式经典的实现中模板方法定义为final可以避免被子类重写。需要子类重写的方法定义为abstract可以强迫子类去实现。不过在实际项目开发中模板模式的实现比较灵活以上两点都不是必须的。
public abstract class AbstractClass {public final void templateMethod() {//...method1();//...method2();//...}protected abstract void method1();protected abstract void method2();
}public class ContreteClass1 extends AbstractClass {Overrideprotected void method1() {//...}Overrideprotected void method2() {//...}
}public class ContreteClass2 extends AbstractClass {Overrideprotected void method1() {//...}Overrideprotected void method2() {//...}
}AbstractClass demo ContreteClass1();
demo.templateMethod(); templateMethod()函数定义为final是为了避免子类重写它。method1()和method2()定义为abstract是为了强迫子类去实现。模板模式把一个算法中不变的流程抽象到父类的模板方法templateMethod()中将可变的部分method1()、method2()留给子类ContreteClass1和ContreteClass2来实现。所有的子类都可以复用父类中模板方法定义的流程代码。
2-jdk中使用模板方法 在Java AbstractList类中addAll()函数可以看作模板方法add()是子类需要重写的方法尽管没有声明为abstract的但函数实现直接抛出了UnsupportedOperationException异常。前提是如果子类不重写是不能使用的。 3-模板模式与Callback回调函数 做过支付的肯定知道回调是什么比如通过三方支付系统来实现支付功能用户在发起支付请求之后一般不会一直阻塞到支付结果返回而是注册回调接口类似回调函数一般是一个回调用的URL给三方支付系统等三方支付系统执行完成之后将结果通过回调接口返回给用户。 回调可以分为同步回调和异步回调或者延迟回调。同步回调指在函数返回之前执行回调函数异步回调指的是在函数返回之后执行回调函数。从应用场景上来看同步回调看起来更像模板模式异步回调看起来更像观察者模式。
1Template类 Spring提供了很多Template类比如JdbcTemplate、RedisTemplate、RestTemplate。尽管都叫作xxxTemplate但它们并非基于模板模式来实现的而是基于回调来实现的确切地说应该是同步回调。而同步回调从应用场景上很像模板模式所以在命名上这些类使用Template模板这个单词作为后缀。 JdbcTemplate通过回调的机制将不变的执行流程抽离出来放到模板方法execute()中将可变的部分设计成回调StatementCallback由用户来定制。query()函数是对execute()函数的二次封装让接口用起来更加方便
2addShutdownHook()
JVM提供了Runtime.addShutdownHook(Thread hook)方法可以注册一个JVM关闭的Hook。当应用程序关闭的时候JVM会自动调用Hook代码。
public class ShutdownHookDemo {private static class ShutdownHook extends Thread {public void run() {System.out.println(I am called during shutting down.);}}public static void main(String[] args) {System.out.println(111111111111111);Runtime.getRuntime().addShutdownHook(new ShutdownHook());System.out.println(2222222222222222);}} 有关Hook的逻辑都被封装到ApplicationShutdownHooks类中了。当应用程序关闭的时候JVM会调用这个类的runHooks()方法创建多个线程并发地执行多个Hook。我们在注册完Hook之后并不需要等待Hook执行完成所以这也算是一种异步回调。
4-小结 从应用场景上来看同步回调跟模板模式几乎一致。它们都是在一个大的算法骨架中自由替换其中的某个步骤起到代码复用和扩展的目的。而异步回调跟模板模式有较大差别更像是观察者模式。 从代码实现上来看回调和模板模式完全不同。回调基于组合关系来实现把一个对象传递给另一个对象是一种对象之间的关系模板模式基于继承关系来实现子类重写父类的抽象方法是一种类之间的关系。 组合优于继承。实际上这里也不例外。在代码实现上回调相对于模板模式会更加灵活主要体现在下面几点 1像Java这种只支持单继承的语言基于模板模式编写的子类已经继承了一个父类不再具有继承的能力。 2回调可以使用匿名类来创建回调对象可以不用事先定义类而模板模式针对不同的实现都要定义不同的子类。 3如果某个类中定义了多个模板方法每个方法都有对应的抽象方法那即便我们只用到其中的一个模板方法子类也必须实现所有的抽象方法。而回调就更加灵活我们只需要往用到的模板方法中注入回调对象即可。