定义一个操作的算法框架,而将具体实现延迟到子类中进行,使得子类在不改变整体算法框架的基础上,可以自定义算法实现。
应用场景
-
多个子类有公有的方法,并且逻辑基本相同时。
-
重要复杂的算法可以把核心算法设计为模板方法,具体细节则由子类实现
-
重构代码时,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。
它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。
① 模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。
② 基本方法:是整个算法中的一个步骤,包含以下几种类型。
-
抽象方法:在抽象类中声明,由具体子类实现。
-
具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。
-
钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。
public abstract class LivePlay {
//模板方法
public final void seeLivePlay() {
login();
openRoom();
startAudioAndVideoStream();
pushVideoStream();
stopAudioAndVideoStream();
closeRoom();
}
//实体方法,这个方法实现通用的业务逻辑
private void login() {
System.out.println("用户登录");
}
/*抽象方法*/
//打开房间
public abstract void openRoom();
//打开音视频流
public abstract void startAudioAndVideoStream();
//关闭音视频流
public abstract void stopAudioAndVideoStream();
//关闭房间
public abstract void closeRoom();
/*钩子方法,可以被需要的子类overwrite*/
//旁路推流,可以通过视频链接在浏览器中查看视频
public void pushVideoStream() {
}
}
//腾讯直播类
public class TencentLivePlay extends LivePlay {
@Override
public void openRoom() {
System.out.println("腾讯打开房间");
}
@Override
public void startAudioAndVideoStream() {
System.out.println("腾讯打开音视频流");
}
@Override
public void stopAudioAndVideoStream() {
System.out.println("腾讯关闭音视频流");
}
@Override
public void closeRoom() {
System.out.println("腾讯关闭房间");
}
//覆写钩子方法,提供旁路推流功能
@Override
public void pushVideoStream() {
super.pushVideoStream();
System.out.println("腾讯进行旁路推流");
}
}
//金山直播类
public class JinShanLivePlay extends LivePlay {
@Override
public void openRoom() {
System.out.println("金山打开房间");
}
@Override
public void startAudioAndVideoStream() {
System.out.println("金山打开音视频流");
}
@Override
public void stopAudioAndVideoStream() {
System.out.println("金山关闭音视频流");
}
@Override
public void closeRoom() {
System.out.println("金山关闭房间");
}
}
public static void main(String[] args) {
//此处省略若干代码
...
LivePlay tencentLive=new TencentLivePlay();
tencentLive.seeLivePlay();
System.out.println("");
LivePlay jinShanLive=new JinShanLivePlay();
jinShanLive.seeLivePlay();
}
根据以下文章总结:
-
Java设计模式:23种设计模式全面解析(超级详细)HYPERLINK http://c.biancheng.net/design_pattern/
-
设计模式 https://blog.csdn.net/shusheng0007/category_8638565.html
-
java设计模式 https://blog.csdn.net/qq_37909508/category_8976362.html
-
设计模式 https://www.cnblogs.com/zuoxiaolong/category/509144.html
-
设计模式 在源码中的应用 https://blog.csdn.net/qq_36970993/category_10620886.html
-
Android系统设计中存在设计模式分析 https://www.2cto.com/kf/201208/150650.html
-
Android设计模式系列 - 基于android的各种代码分析各种设计模式 https://www.cnblogs.com/qianxudetianxia/category/312863.html