1. 程式人生 > >結合Mybatis源碼看設計模式——外觀模式

結合Mybatis源碼看設計模式——外觀模式

外觀 color spa 參數 完全 是你 ins clas inf

定義

  提供了一個統一的接口,用來訪問子系統中一群接口

適用場景

  1. 子系統復雜,增加外觀模式提供簡單調用接口
  2. 構建多層系統結構,用外觀對象作為每層入口

詳解
  外觀模式,主要理解外觀。通俗一點可以認為這個模式是將子系統封裝到一起,提供給應用的層面就提供一個方法。不直接由應用層直接訪問子系統。
技術分享圖片

  下面我們看看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圖畫出
技術分享圖片


總結:
  外觀模式和前面講的模式不是太一樣,外觀模式只是一個結構而已,前面幾篇博客更多的是創建型的設計模式。就是使用這個設計模式可以具體完成類的創建,實例化等等,而外觀模式更多考慮是客戶端使用的方便,是在子系統和客戶端之間的一個幫手。在生活中就像房屋中介一樣,如果你想買二手房,你自己可能找不到很好的房源,但是你找中介只需要告訴他們房子大概多大,在哪,幾層,中介就會幫你找到這樣的房子並提供給你。當然了,設計模式還是要結合具體的業務來說,不能說學了外觀模式,就完全禁止客戶端和子系統的交互。

結合Mybatis源碼看設計模式——外觀模式