gpt4 book ai didi

java - 父包装子类方法

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:37:16 24 4
gpt4 key购买 nike

我让这些 Worker 类做一些工作:

class WorkerOne implements IWorker {
@Override
public doWork(Resource resource){
// do some work
}
}

我希望所有 doWork() 方法都被同一个操作包装。

实现它的一种方法是创建一个抽象类,如下例所示:

abstract class WorkWrapper implements IWorker {
@Override
public doBetterWork(){
Resource resource = // ...
doWork(resource)
resource .close();
}
}


class WorkerOne extends WorkWrapper {

protected doWork(Resource resource){
// do some work
}
}

并将 Worker 调用为:

WorkerOne worker = new WorkerOne();
worker.doBetterWork();

出于某些原因,我不喜欢使用继承。有没有更好的解决方案来进行这种包装?

最佳答案

使用可以在接口(interface)中定义的default 方法可以避免继承(extends)并坚持实现(implements):

class WorkerOne implements IWorker {
@Override
public void doWork(Resource resource){
// do some work
}
}

public interface IWorker {
void doWork(Resource resource);

default void doBetterWork(){
Resource resource = // ...
doWork(resource)
reource.close();
}
}

然后像以前一样使用它:

IWorker worker = new WorkerOne();
worker.doBetterWork();

I want all doWork() methods to be wrapped by the same operation.

就我个人而言,我不太喜欢这样的设计:我在 API 方面公开了两种方法,而类的客户端只能调用其中一种方法。这是误导。
为了避免这种情况,我可能会使用组合和装饰器(不是传统的装饰器,因为两个 doWork() 方法之间的签名不同)。

public interface IWorker {
void doWork(Resource resource);
}

class WorkWrapper{

private IWorker decorated;
public WorkWrapper(IWorker decorated){
this.decorated = decorated;
}
@Override
public doWork(){
Resource resource = // ...
decorated.doWork(resource);
reource.close();
}
}

class FooWork implements IWorker {

@Override
public doWork(Resource resource){
// do something...
}
}

现在没有歧义是可能的:

WorkWrapper worker = new WorkWrapper(new FooWork());
worker.doWork(); // just this method is exposed now in WorkWrapper

您可以将它与工厂结合起来,使事情变得更简单,并从客户端隐藏实现细节:

WorkWrapper worker = FooWork.createWrapperFor();
worker.doWork();

关于java - 父包装子类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56691972/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com