1. 程式人生 > >bridge - 物件結構型模式

bridge - 物件結構型模式

   1.意圖
            將抽象部分和它的實現部分分離,使它們都可以獨立變化
    2.參與者
      Abstraction - 定義抽象介面
                  - 維護一個指向Implementor型別物件的指標
      RefindAbstraction -擴充由Abstraction定義的介面
      Implementor  -定義實現類的介面,該介面不一定與 Abstraction的介面完全
                                         一致,事實上這兩個介面可以完全不同,一般來講,Implementor
                                         介面僅提供基本操作,而Abstraction則定義了基於這些操作的較高
                                         層的操作
     ConcreteImplementor - 實現Implementor介面並定義它的實現。

 

3.結構

4.程式碼

public interface Abstraction {
	public Implementor getImplementor();
}

public class RefindAbstractionA implements Abstraction {

	@Override
	public Implementor getImplementor() {
		return (Implementor) AbstractFactory.Instance().getObject("A");
	}
	public void draw(){
    	System.out.println("RefindAbstractionA");
    	getImplementor().draw();
    }
}

public class RefindAbstractionB implements Abstraction {

	@Override
	public Implementor getImplementor() {
		return (Implementor) AbstractFactory.Instance().getObject("B");
	}
    public void draw(){
    	System.out.println("RefindAbstractionB");
    	getImplementor().draw();
    }
}

public class ConcreteImplementorA implements Implementor {

	@Override
	public void draw() {
		System.out.println("draw line");
		
	}

}

public class ConcreteImplementorB implements Implementor {

	@Override
	public void draw() {
		System.out.println("draw clycle");
	}

}

public class AbstractFactory {
	private Map<String, Object> ObjectMap = new HashMap<String, Object>();
    private final static AbstractFactory abstractFactory = new AbstractFactory();
    private AbstractFactory(){
    	register("A",new ConcreteImplementorA());
    	register("B",new ConcreteImplementorB());
    }
    public static AbstractFactory Instance(){
    	return abstractFactory;
    }
    public void register(String flag,Object o){
    	Object oo = ObjectMap.get(flag);
    	if(oo != null){
    		throw new RuntimeException(flag+"標識已存在請重新定義一個標識!");
    	}
    	ObjectMap.put(flag, o);
    }
    public Object getObject(String flag){
    	Object o = ObjectMap.get(flag);
    	if(o == null){
    		throw new RuntimeException(flag+"標識不存在!");
    	}
    	return o;
    }
}

public class Client {
   public static void main(String[] args) {
	   RefindAbstractionB B = new RefindAbstractionB();
	   B.draw();
    }
}

註釋:抽象工廠我只是儲存物件並沒有新建物件,所以物件存在可以改變的物件變數的時候不要使用。