標籤:win8 適配器模式 設計模式
實際上適配器模式是用於解耦。設想一下我們的程式模組A在與模組B打交道時,需要在許多地方多次使用B中某個類的方法,而負責開發B的程式猿Tom還未完全實現該類,會隨時更改該類中的方法,那麼當Tom在修改時,負責A的攻城獅Jerry不得不進行苦逼的修改。聰明的專案經理Dabao想出了好方法——適配器模式,於是在Tom和Jerry之間進行了如下設計:
/// <summary> /// B中目前只定義了英雄KASS /// </summary> public class KASS { public void R() { //KASS的技能 } }/// <summary> /// 定義英雄的介面 /// </summary> public class Hero { /// <summary> /// 使用virtual修飾以便子類可以重寫 /// </summary> public virtual void attack() { //英雄進攻的方法和招數 } } /// <summary> /// 定義適配器/// B暫時提供英雄KASS /// </summary> public class HeroAdapter:Hero { // 建立一個私人的英雄KASS對象 private KASS kass = new KASS(); /// <summary> /// 通過重寫,表面上調用attack()方法,實際調用R() /// </summary> public override void attack() { kass.R(); } }/// <summary> /// Tom負責的模組A /// </summary>public class A { public static void Main(string[] args) { // A需要藉助B中的英雄完成進攻的任務,但B還未定下是那個英雄,所以不能直接建立特定英雄的對象// 但我們知道肯定要一個英雄,並且需要這個英雄去進攻 Hero hero = new HeroAdapter(); hero.attack(); //... } }
這樣有一天B將KASS替換成另一個英雄後,A不需要進行任何改動,只要將適配器HeroAdapter中的英雄替換為B修改後的新英雄,並將attack方法中的實現換成新英雄的技能即可。任A多次使用英雄,最終只需修改一個適配器即可,這就實現了A和B的解耦。實際上我認為適配器的另一個作用是擔當了A和B之間溝通的橋樑:HeroAdapter出現在A中,同時HeroAdapter中包含B中的元素。負責B的Tom通過適配器明白他建立的英雄要能夠完成A中進攻的任務。
這裡再舉一個實際開發的例子進一步探討一下適配器模式。
Win8.1 Metro開發中,XAML綁定了一個對象University
using demo02.Helper;using System;using System.Collections.Generic;using System.Collections.ObjectModel;using System.Linq;using System.Text;using System.Threading.Tasks;namespace demo02.DataModel{ public class University : Base { public University(String id, String name, String summary, String imagePath, String category, double stars, String tileImagePath) : base(id, name, summary, imagePath) { this.Category = category; this.Stars = stars; this.Projects = new ObservableCollection<Project>(); this.Images = new ImageHelper(); this.TileImagePath = tileImagePath; } public string TileImagePath { get; set; } public string Category { get; set; } public double Stars { get; set; } public ObservableCollection<Project> Projects { get; set; } public int ClickTimes { get; set; } //相容 public ImageHelper Images { get; set; } }}
我會向伺服器請求該對象的JSON形式,伺服器端根據大學Id將大學資訊找到後組織到自己定義的類中,由於XAML綁定的緣故,我無法直接使用伺服器端自己定義的類形式,這勢必要經過一道工序,將伺服器端的類形式轉化為我需要的類形式,這就好比外國朋友電器的插頭不能適應我們國家的插座,那就需要一個適配器,通過適配器插到我們的插座上。其實上面的大學類就相當於這個適配器,我將這個類告知負責伺服器端開發的隊友,他根據這個類的形式重新組織要發送的JSON。而我這邊不需要再進行轉化。