門面模式(visitor)也要作外觀模式, 是一種很是常見的封裝模式,它的定義以下(額 模式開始前仍是說說他的定義,這樣對他有個大概的認識會比較好進行閱讀,至少我是這麼感受的,甭管你懂不懂 , 可是 至少知道它是這麼一回事 ,不求甚解在程序裏面仍是很實用的, 記住不少概念,而後開始的時候彷佛不是很懂,可是彷佛在某個時候本身頓悟了,oh my god 原來門面模式是這麼一回事)java
每一個書裏面都有本身的例子, 可是做爲一個遊戲開發者, 我會給出的是我作過的用在遊戲中的例子編程
我所作的遊戲裏面社交一塊的關係又,好友,結拜 和結婚。安全
咱們以兩我的要結婚爲例子。結婚的需求是兩我的必須是好友,可是兩我的不能有結拜關係。學習
這是一個社交關係的子系統,跟其餘的系統沒有什麼關係,也是使用門面模式的最佳場合。spa
FriendManager.java 代碼以下代理
public class FriendManager { private static FriendManager instance = null; private FriendManager(){ } public static synchronized FriendManager getInst(){ if( instance == null ){ instance = new FriendManager(); } return instance; } public boolean isFriend(String a , String b ){ System.out.println("the a and b is friend "); return true; } }
MarryManager.java代碼以下code
public class MarryManager { private static MarryManager marryManager = null; private MarryManager(){ } public static synchronized MarryManager getInstance(){ if(marryManager == null){ marryManager = new MarryManager(); } return marryManager; } public void marrySomeBody(String a , String b){ System.out.println(a + "marry with " + b); } }
JiebaiManager.java代碼以下對象
public class JiebaiManager { private static JiebaiManager instance = null; private JiebaiManager(){ } public static synchronized JiebaiManager getInst(){ if(instance == null){ instance = new JiebaiManager(); } return instance; } public boolean isJiebai(String a ,String b){ System.out.println( a +" is not jie bai with " + b); return false; } }
最後一個類爲門面類 , 也就是子系統提供服務的接口類 , 因爲代碼簡單,因此沒有用接口 ,可是在實際編程的時候,請面向接口編程, 這是個好習慣blog
SocietyManager.java繼承
public class SocietyManager { public static void marry(String a , String b){ if(! FriendManager.getInst().isFriend(a, b)){ System.out.println("it's not friend can't marry"); return; } if( JiebaiManager.getInst().isJiebai(a, b)){ System.out.println("jiebai can't marry"); } MarryManager.getInstance().marrySomeBody(a , b); } public static void main(String[] args){ SocietyManager.marry("join", "marry"); } }
場景也包含在了裏面 運行結果爲
the a and b is friend
join is not jie bai with marry
joinmarry with marry
這就是門面模式
門面模式的優勢是 封裝的很是好,子系統比較複雜的時候 類的客戶端不須要知道類的內部實現。
當門面類較大的時候能夠考慮 將門面類擴展爲多個, 保存一個門面的引用在另一個門面類的裏面, 可讓代碼結構更加簡單
門面模式減小了系統之間的相互依賴,若是不這樣作 ,那麼MarryManager.java在調用marry方法的時候 會直接 調用 FriendManager和JiebaiManager裏面的方法 增長了耦合。
提升了系統的靈活性 ,無論 FriendManager , MarryManager,JiebaiManager如何變化, 只要不影響到結拜對象 ,能夠自由活動
提升了安全性, 不經過門面 休想訪問子系統裏面的任何東西。
門面模式的缺點是 違背了開閉原則 , 當系統出現錯誤的時候 沒法經過 繼承 覆寫解決 惟一能作的是修改門面模式的 代碼
門面模式,代理模式,訪問者模式 都是經過間隔的使用代理的類調用實際的類的方法 實現解耦。
學習之餘的筆記,只是對本身學習的一個總結,不具有很強的學術性, 看看 罷了= =