門面模式

  門面模式(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如何變化, 只要不影響到結拜對象 ,能夠自由活動

提升了安全性, 不經過門面 休想訪問子系統裏面的任何東西。

門面模式的缺點是 違背了開閉原則 , 當系統出現錯誤的時候 沒法經過 繼承 覆寫解決  惟一能作的是修改門面模式的 代碼

門面模式,代理模式,訪問者模式   都是經過間隔的使用代理的類調用實際的類的方法 實現解耦。

 

學習之餘的筆記,只是對本身學習的一個總結,不具有很強的學術性,  看看 罷了= = 

相關文章
相關標籤/搜索