AspectJ を使ったデザインパターンの改善と支援 > Bridge

最終更新日 : 2002/12/15 (2002/12/15 より)

Bridge

抽出されたクラスと実装を分離して、それらを独立に変更できるようにする。

Bridge の導入

サンプルコード:
import java.util.List;

public class Abstraction {

	public void printList(List list) {

		for (int i = 0 ; i < list.size() ; i++) {
			System.out.println( list.get(i) );
		}

		System.out.println();
	}
}
import java.util.List;

public class RefinedAbstraction extends Abstraction {

	public void printListAndHeader(List list, String header) {

		System.out.println(header);

		printList(list);
	}
}
import java.util.List;

public interface Implementor {

	public void printListImpl(List list);
}
import java.util.List;
import java.util.Iterator;

public class ConcreteImplementor implements Implementor {

	public void printListImpl(List list) {

		System.out.println("ConcreteImplementor"); // 動作確認用

		Iterator itr = list.iterator();

		while ( itr.hasNext() ) {
			System.out.println( itr.next() );
		}

		System.out.println();
	}
}
public class Client {

	public static void main(String[] args) {

		String[] strs = {"aaa", "bbb", "ccc"};

		List list = Arrays.asList(strs);


		Abstraction ab = new Abstraction();

		ab.printList(list);


		ab.setImplementor( new ConcreteImplementor() );

		ab.printList(list);


		RefinedAbstraction ra = new RefinedAbstraction();

		ra.printListAndHeader(list, "***");


		ra.setImplementor( new ConcreteImplementor() );

		ra.printListAndHeader(list, "***");
	}
}
import java.util.List;

public aspect BridgeAspect {

	private Implementor Abstraction.impl;

	pointcut printList(Abstraction obj, List list) :
		target(obj) &&
		args(list) &&
		call( void Abstraction.printList(List) ) &&
		if (obj.impl != null);

	void around(Abstraction obj, List list) : printList(obj, list) {
		obj.impl.printListImpl(list);
	}
	
	public void Abstraction.setImplementor(Implementor impl) {
		this.impl = impl;
	}
}
aaa
bbb
ccc

ConcreteImplementor
aaa
bbb
ccc

***
aaa
bbb
ccc

***
ConcreteImplementor
aaa
bbb
ccc

実装ノート

更新履歴