【问题标题】:Decorator that covers all methods and passes automatically first parameter覆盖所有方法并自动传递第一个参数的装饰器
【发布时间】:2012-09-26 11:04:10
【问题描述】:

我有一个类BaseClass,其中包含一些方法,例如

public Result mothodA(Token token, String arg1, String arg2);

public Result mothodB(Token token, String arg1);

public OtherResult mothodC(Token token, String arg1, String arg2);

...

是否可以以某种方式装饰此类以自动传递Token 参数(将存储在装饰器中)?

预期输出:

DecoratedBaseClass decorated = new DecoratedBaseClass();
Result result = decorated.methodA("arg1", "arg2");
OtherResult otherResult = decorated.methodC("arg1", "arg2");

我打赌这是不可能的,但也许我不知道装饰器的一些技巧。

【问题讨论】:

  • 你可以有一个带Token的构造函数吗?
  • 我现在无法修改BaseClass - 它是使用 WSDL 文件生成的。我将在DecoratedBaseClass 构造函数中创建Token 对象。

标签: java decorator


【解决方案1】:

您更改了BaseClass 的接口,因此这与装饰器无关,它更像是一个适配器。

装饰器
动态地为对象附加额外的职责保持相同的界面。

构建一个BaseClassAdapter 并将调用委托给BaseClass

public class BaseClassAdapter {

    private final BaseClass baseClass;
    private final Token token;

    public BaseClassAdapter(BaseClass baseClass){ 
       this.baseClass = baseClass;
       this.token = ...;
    }

    public Result mothodA(String arg1, String arg2) {
       baseClass.mothodA(token, arg1, arg2);
    }

    ...
}

【讨论】:

    【解决方案2】:
    DecoratedBaseClass decorated = new DecoratedBaseClass(token);
    

    DecoratedBaseClass 中的构造函数

    //constructor in baseclass
    public DecoratedBaseClass(Token token) {
        this.token = token;
    }
    

    【讨论】:

    • 当然可以,但我想避免在装饰器中创建method[A-Z] 并神奇地做到这一点。 BaseClass 中的方法需要第一个参数,我无法修改它们以从参数中获取值。
    • 如果你使用 Spring,你可以使用依赖注入。
    • 很遗憾这个项目不能使用 Spring。
    • 在后台传递这个Token 参数。我想打电话给decorated.methodA("arg1", "arg2"); 而不是decorated.methodA(token, "arg1", "arg2");
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 2017-07-12
    • 2018-03-22
    • 1970-01-01
    • 2017-07-17
    • 2020-12-26
    • 2020-01-07
    相关资源
    最近更新 更多