1、概述
模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。
2、使用场景
1)当你只希望客户端扩展某个特定算法步骤, 而不是整个算法或其结构时, 可使用模板方法模式。
2)当多个类的算法除一些细微不同之外几乎完全一样时, 你可使用该模式。 但其后果就是, 只要算法发生变化, 你就可能需要修改所有的类。
3、实例
有以下场景:
有三个电商网站:
淘宝,京东,拼多多
都具有以下相似的能力:
登录,登出,查询商品,下单。
模板方法实现。
创建商城抽象接口:
/**
* 商城顶层抽象
* @date: 2021/1/26
* @author weirx
* @version 3.0
*/
abstract class Mall {
/**
* 登录
*/
public abstract void login();
/**
* 登出
*/
public abstract void logout();
/**
* 查询商品
*/
public abstract void query();
/**
* 下单
*/
public abstract void order();
}
创建淘宝:
/**
* 淘宝
* @date: 2021/1/26
* @author weirx
* @version 3.0
*/
public class Taobao extends Mall{
@Override
public void login() {
System.out.println("登录淘宝商城");
}
@Override
public void logout() {
System.out.println("退出淘宝商城");
}
@Override
public void query() {
System.out.println("查询淘宝商城商品");
}
@Override
public void order() {
System.out.println("淘宝商城下单");
}
}
创建京东:
/**
* 淘宝
* @date: 2021/1/26
* @author weirx
* @version 3.0
*/
public class Jingdong extends Mall{
@Override
public void login() {
System.out.println("登录京东商城");
}
@Override
public void logout() {
System.out.println("退出京东商城");
}
@Override
public void query() {
System.out.println("查询京东商城商品");
}
@Override
public void order() {
System.out.println("京东商城下单");
}
}
创建拼多多:
/**
* 淘宝
* @date: 2021/1/26
* @author weirx
* @version 3.0
*/
public class Pinduoduo extends Mall{
@Override
public void login() {
System.out.println("登录拼多多商城");
}
@Override
public void logout() {
System.out.println("退出拼多多商城");
}
@Override
public void query() {
System.out.println("查询拼多多商城商品");
}
@Override
public void order() {
System.out.println("拼多多商城下单");
}
}
4、分析
Mall.png三个商城分别继承Mall,并重写其接口。
5、总结
优点:
1)你可仅允许客户端重写一个大型算法中的特定部分, 使得算法其他部分修改对其所造成的影响减小。
2)你可将重复代码提取到一个超类中。
缺点:
1)部分客户端可能会受到算法框架的限制。
2)通过子类抑制默认步骤实现可能会导致违反里氏替换原则。
3)模板方法中的步骤越多, 其维护工作就可能会越困难。
网友评论