java - 模板方法和继承或组合
问题描述
我有这些课程:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private int age;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Admin {
private String name;
private int age;
}
而且我有一些模板方法模式实现的操作。带算法的基类:
public abstract class Operation<T> {
public void process(T t) {
System.out.println(t);
updateName(t);
System.out.println(t);
}
protected abstract void updateName(T t);
}
实现模板方法的两个孩子:
@Component
public class UserOperation extends Operation<User> {
@Override
protected void updateName(User user) {
String newName = user.getName().toUpperCase();
user.setName(newName);
}
}
@Component
public class AdminOperation extends Operation<Admin> {
@Override
protected void updateName(Admin admin) {
String name = admin.getName();
StringBuilder builder = new StringBuilder();
builder.append(name);
StringBuilder reverse = builder.reverse();
admin.setName(reverse.toString());
}
}
我的问题:
如何重写此代码以使用组合?
我是否正确理解使用模板方法时,我附加到继承?
模板方法是避免重复的好方法。但是如果它将我绑定到继承,还有什么其他方法可以避免代码重复?在我的示例中,如何使用组合?(用其他东西替换模板方法?)
解决方案
1)如何重写此代码以使用组合?
策略模式是一种方式。本质上,您可以通过将操作传递给数据而不是将数据传递给操作来反转数据和操作之间的关系。这是一个根本性的变化,因为使用“真实”对象(具有状态和行为)而不是数据类。
2)我是否正确理解使用模板方法时,我附加到继承?
是的,模板方法模式基本上是基于继承的。
推荐阅读
- reactjs - React Hook 的状态究竟是什么时候设置的?
- javascript - Angular 构建失败,找不到模块
- macos - Atom 编辑器在重新启动 / OSX 后不工作
- typescript - Check if an object is a type of a generic type in Typescript
- sql - 如何根据选择查询的子集运行计数
- r - 在R基础的数据框中按行对数值进行排名
- excel - VBA Excel修改文件并保持相同的校验和
- xcode - 将 GitLab 帐户添加到 Xcode 时,您应该为帐户名称输入什么?
- python - 在 django 中加速 .txt 到 db 的方法
- javascript - 如何使用每个循环更改数组中的自定义值?