bridge - 物件結構型模式
阿新 • • 發佈:2018-12-18
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(); } }
註釋:抽象工廠我只是儲存物件並沒有新建物件,所以物件存在可以改變的物件變數的時候不要使用。