首页 > 解决方案 > 模板方法和继承或组合

问题描述

我有这些课程:

@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. 我是否正确理解使用模板方法时,我附加到继承?

模板方法是避免重复的好方法。但是如果它将我绑定到继承,还有什么其他方法可以避免代码重复?在我的示例中,如何使用组合?(用其他东西替换模板方法?)

标签: javainheritancedesign-patternscompositiontemplate-method-pattern

解决方案


1)如何重写此代码以使用组合?

策略模式是一种方式。本质上,您可以通过将操作传递给数据而不是将数据传递给操作来反转数据和操作之间的关系。这是一个根本性的变化,因为使用“真实”对象(具有状态和行为)而不是数据类。

2)我是否正确理解使用模板方法时,我附加到继承?

是的,模板方法模式基本上是基于继承的。


推荐阅读