定義 提供了一個統一的介面,用來訪問子系統中一群介面 適用場景 詳解 外觀模式,主要理解外觀。通俗一點可以認為這個模式是將子系統封裝到一起,提供給應用的層面就提供一個方法。不直接由應用層直接訪問子系統。 下麵我們看看ibatis的源碼來具體理解外觀模式。 上述代碼其實是完成一個創建MetaObjec ...
定義
提供了一個統一的介面,用來訪問子系統中一群介面
適用場景
- 子系統複雜,增加外觀模式提供簡單調用介面
- 構建多層系統結構,用外觀對象作為每層入口
詳解
外觀模式,主要理解外觀。通俗一點可以認為這個模式是將子系統封裝到一起,提供給應用的層面就提供一個方法。不直接由應用層直接訪問子系統。
下麵我們看看ibatis的源碼來具體理解外觀模式。
public MetaObject newMetaObject(Object object) { return MetaObject.forObject(object, this.objectFactory, this.objectWrapperFactory, this.reflectorFactory); }
上述代碼其實是完成一個創建MetaObject的事情,但是它是將一個負責創建MetaObject的子系統放在了這個方法裡面。為什麼要這麼做?實際上如果直接讓我們應用層去使用MetaObject.forObject(object, this.objectFactory, this.objectWrapperFactory, this.reflectorFactory);這個方法。可以看出參數實在太多,而Configuration類使用外觀模式,外觀類並不具體實現什麼,他只是負責調用和管理子系統
下麵看看configuration中的構造器
可以把上面的objectFactory,objectWrapperFactory,reflectorFactory看作三個子系統
接下來到MetaObject的裡面看看forObject方法
public static MetaObject forObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) { return object == null ? SystemMetaObject.NULL_META_OBJECT : new MetaObject(object, objectFactory, objectWrapperFactory, reflectorFactory); }
對應的構造函數
private MetaObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) { this.originalObject = object; this.objectFactory = objectFactory; this.objectWrapperFactory = objectWrapperFactory; this.reflectorFactory = reflectorFactory; if (object instanceof ObjectWrapper) { this.objectWrapper = (ObjectWrapper)object; } else if (objectWrapperFactory.hasWrapperFor(object)) { this.objectWrapper = objectWrapperFactory.getWrapperFor(this, object); } else if (object instanceof Map) { this.objectWrapper = new MapWrapper(this, (Map)object); } else if (object instanceof Collection) { this.objectWrapper = new CollectionWrapper(this, (Collection)object); } else { this.objectWrapper = new BeanWrapper(this, object); } }
可以看出這個MetaObject也是個將構造器私有的特殊單例模式,大致分析了一下就用下麵的UML圖畫出
總結:
外觀模式和前面講的模式不是太一樣,外觀模式只是一個結構而已,前面幾篇博客更多的是創建型的設計模式。就是使用這個設計模式可以具體完成類的創建,實例化等等,而外觀模式更多考慮是客戶端使用的方便,是在子系統和客戶端之間的一個幫手。在生活中就像房屋中介一樣,如果你想買二手房,你自己可能找不到很好的房源,但是你找中介只需要告訴他們房子大概多大,在哪,幾層,中介就會幫你找到這樣的房子並提供給你。當然了,設計模式還是要結合具體的業務來說,不能說學了外觀模式,就完全禁止客戶端和子系統的交互。