Java既存の方法を強化する3つの方法
1633 ワード
1、最初の種類は、最も簡単なもので、クラスを継承し、元の方法をカバーする。
2、装飾者モード
これは最初より複雑です。ここでゆっくり説明します。
まず、もし私達はやはりCatのrun方法を強化します。CatがICatインターフェースを実現すると仮定する。この時、私たちは装飾者を必要として、方法を広げてくれます。そしてこの装飾者はICatインターフェースを実現しなければならない。(実際の運用では、装飾者はソースオブジェクトと同じインターフェースを実現しなければなりません。または同じ親類を継承します。)次は飾り物の書き方です。
ここでは、動的エージェントは何ですか?一般的な書き方は変わりません。
一つ目はClass Lorderで、二つ目は対象のすべてのインターフェースで、三つ目はInvocationHandlerです。InvocationHandlerのinvoke方法を書き直し、メソッド名で判断するには、強化する方法が必要です。
Cat cat = new Cat(){
@Override
public void run(){
// run
super.run();
System.out.println(" ");
}
}
これは分かりやすくて、私達もたくさん使っています。しかし、この方法を使うという前提があります。私たちはコントロールクラスの作成ができます。こういう時こそ、こうすることができます。例えば工場のモードはこのようにできません。2、装飾者モード
これは最初より複雑です。ここでゆっくり説明します。
まず、もし私達はやはりCatのrun方法を強化します。CatがICatインターフェースを実現すると仮定する。この時、私たちは装飾者を必要として、方法を広げてくれます。そしてこの装飾者はICatインターフェースを実現しなければならない。(実際の運用では、装飾者はソースオブジェクトと同じインターフェースを実現しなければなりません。または同じ親類を継承します。)次は飾り物の書き方です。
class CatFilter implements ICat{
// cat
private ICat cat;
public CatFilter(ICat cat){
this.cat = cat;
}
public void run(){
cat.run();
System.out.println(" ");
}
}
私達が方法を拡張する時、装飾者のrun方法を呼び出すべきです。ICat cat = new Cat();
CatFilter catFilter = new CatFilter(cat);
catFilter.run();
3、ダイナミックエージェントここでは、動的エージェントは何ですか?一般的な書き方は変わりません。
// Cat
ICat cat = new Cat();
ICat catProxy = Proxy.newProxyInstance(cat.getClass().getClassLoader,
cat.getClass().getInterfaces(),
new InvocationHandler(){
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable{
if(method.getName().eques("run")){
method.invoke(cat, args);
System.out.println(" ");
}
return null;
}
});
catProxy.run();
ここではProxy.newProxyInstanceを呼び出す方法で、三つのパラメータが入ってきます。一つ目はClass Lorderで、二つ目は対象のすべてのインターフェースで、三つ目はInvocationHandlerです。InvocationHandlerのinvoke方法を書き直し、メソッド名で判断するには、強化する方法が必要です。