itamar:
私はいくつかの仕事をしているこれらの労働者のクラスを持っています:
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
}
}
そして、労働者のよう呼び出します。
WorkerOne worker = new WorkerOne();
worker.doBetterWork();
私は、継承を使用しないいくつかの理由から。このラッピングを行うには良い解決策はありますか?
davidxxx:
では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();
私はすべてのdoWork()メソッドは、同じ操作で包まれたいです。
個人的に私はどちらか一方しか、クラスのクライアントによって呼び出されるべきながら、私はAPIの面で2つのメソッドを公開する非常に多くのデザインが好きではありません。それは誤解を招くです。
これを回避するために、私はおそらく、(両者の署名が異なるようにしない従来のデコレータ組成およびデコレータを使用する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();