济源市住房和城乡建设局网站,教育培训机构加盟,网站开发和大数据开发区别,html5网页设计论文模板方法模式 模板方法模式定义:使用场景角色定义抽象模板: 为抽象模板#xff0c;它的方法分为两类AbstractClass1. 基本方法: 也叫做基本操作#xff0c;是由子类实现的方法#xff0c;并且在模板方法被调用。2. 模板方法: 可以有一个或几个#xff0c;一般是一个具体方法… 模板方法模式 模板方法模式定义:使用场景角色定义抽象模板: 为抽象模板它的方法分为两类AbstractClass1. 基本方法: 也叫做基本操作是由子类实现的方法并且在模板方法被调用。2. 模板方法: 可以有一个或几个一般是一个具体方法也就是一个框架实现对基本方法的调度完成固定的逻辑3. 为了防止恶意操作一般模板方法都会加上 final 关键字不允许被覆写。 具体模板: 实现父类所定义的一个或多个抽象方法也就是父类定义的基本方法在子类中得以实现。 需求背景定义用户行为日志基类UserBehaviorLogger 定义用户登录行为子类LoginLogger 定义用户涉及现金交易子类CashTransactionLogger 定义用户领取活动优惠券子类CouponReceiveLogger 测试示例示例分析 模板方法模式定义: 定义一个操作中算法的框架将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 使用场景
多个子类有公有的方法并且逻辑基本相同时重要、复杂的算法可以把核心算法设计为模板方法周边的相关细节功能则由各个子类实现。重构时模板方法模式是一个经常使用的模式把相同的代码抽取到父类中约束其行为。
角色定义
抽象模板: 为抽象模板它的方法分为两类AbstractClass
1. 基本方法: 也叫做基本操作是由子类实现的方法并且在模板方法被调用。
2. 模板方法: 可以有一个或几个一般是一个具体方法也就是一个框架实现对基本方法的调度完成固定的逻辑
3. 为了防止恶意操作一般模板方法都会加上 final 关键字不允许被覆写。
具体模板: 实现父类所定义的一个或多个抽象方法也就是父类定义的基本方法在子类中得以实现。
需求背景 使用模板方法模式实现在项目当中用户的不同行为日志处理比如用户登录、现金交易、领取活动优惠券、注意不同用户行为日志格式不一样需要下推到子类实现记录到数据库。 定义用户行为日志基类UserBehaviorLogger
public abstract class UserBehaviorLogger {protected abstract String getLogFormat();public void log(String userId, String behavior) {String log String.format(getLogFormat(), userId, behavior);saveLogToDatabase(log);}private void saveLogToDatabase(String log) {// 将日志保存到数据库中// ...}
}定义用户登录行为子类LoginLogger
public class LoginLogger extends UserBehaviorLogger {Overrideprotected String getLogFormat() {return User %s logged in at %s;}
}定义用户涉及现金交易子类CashTransactionLogger
public class CashTransactionLogger extends UserBehaviorLogger {Overrideprotected String getLogFormat() {return User %s made a cash transaction at %s;}
}定义用户领取活动优惠券子类CouponReceiveLogger
public class CouponReceiveLogger extends UserBehaviorLogger {Overrideprotected String getLogFormat() {return User %s received a coupon at %s;}
}测试示例 public static void main(String[] args) {UserBehaviorLogger logger new LoginLogger();logger.log(123456, 2022-01-01 10:00:00);logger new CashTransactionLogger();logger.log(123456, 2022-01-01 11:00:00);logger new CouponReceiveLogger();logger.log(123456, 2022-01-01 12:00:00);}示例分析
在这个示例中我们定义了一个抽象类 UserBehaviorLogger它有一个抽象方法 getLogFormat()用于获取当前用户行为类型对应的日志格式。具体的行为日志记录器如 LoginLogger、CashTransactionLogger 和 CouponReceiveLogger都继承自 UserBehaviorLogger 并实现了 getLogFormat() 方法用于返回对应的日志格式。在基类 log() 方法中我们根据当前用户行为类型获取对应的日志格式并使用 String.format() 方法格式化日志内容最终将日志保存到数据库中。使用时我们可以根据不同的用户行为类型创建对应的日志记录器并调用 log() 方法记录日志这样我们就可以根据不同的用户行为类型使用不同的日志格式进行记录了。同时由于使用了模板方法模式我们也将日志记录的具体实现细节下推到了子类中使得代码更加清晰和易于维护。