Java既存の方法を強化する3つの方法

1633 ワード

1、最初の種類は、最も簡単なもので、クラスを継承し、元の方法をカバーする。
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方法を書き直し、メソッド名で判断するには、強化する方法が必要です。