Design Patterns : Bridge 2018/11

• 実装クラスから機能クラスを分離し、拡張性を高める。
• 下記例では抽象クラス間で実装が「橋渡し」。

UML

BridgeDriverクラス(abstract)
public abstract class BridgeDriver {

    public abstract void doSth1();
        
    public abstract void doSth2();
                
    public void doSth3() {
        System.out.println("BridgeDriver:doSth3");
    }
                                    
    public void doSth4() {
        System.out.println("BridgeDriver:doSth4");
    }
}

TypeADriverクラス
public class TypeADriver extends BridgeDriver {

    @Override
    public void doSth1() {
        System.out.println("TypeADriver:doSth1");
    }
                            
    @Override
    public void doSth2() {
        System.out.println("TypeADriver:doSth2");
    }
}

TypeBDriverクラス
public class TypeBDriver extends BridgeDriver {

	@Override
	public void doSth1() {
		System.out.println("TypeBDriver:doSth1");
	}
	
	@Override
	public void doSth2() {
		System.out.println("TypeBDriver:doSth2");
	}
	
	@Override
	public void doSth3() {
		System.out.println("TypeBDriver:doSth3");
	}
}

BridgeHandlerクラス(abstract)
public abstract class BridgeHandler {

	protected BridgeDriver driver;
	
	public BridgeHandler(BridgeDriver driver) {
		this.driver = driver;
	}
	
	public abstract void handle1();
}
※インターフェースにすると分離性を高められる。

DriverHandlerクラス
public class DriverHandler extends BridgeHandler {

	public DriverHandler(BridgeDriver driver) {
		super(driver);
	}
	
	@Override
	public void handle1() {
		System.out.println("handle1 start");
		driver.doSth1();
		driver.doSth2();
		driver.doSth3();
		driver.doSth4();
		System.out.println("handle1 end");
	}
}

Executerクラス
public class Executer {

	public static void main(String[] args) {
		BridgeHandler handlerA = new DriverHandler(new TypeADriver());
		BridgeHandler handlerB = new DriverHandler(new TypeBDriver());
		
		handlerA.handle1();
		handlerB.handle1();
	}
}