门面模式

  门面模式(visitor)也要做外观模式, 是一种非常常见的封装模式,它的定义如下(额 模式开始前还是说说他的定义,这样对他有个大概的认识会比较好进行阅读,至少我是这么感觉的,甭管你懂不懂 , 但是 至少知道它是这么一回事 ,不求甚解在程序里面还是很实用的, 记住很多概念,然后开始的时候似乎不是很懂,但是似乎在某个时候自己顿悟了,oh my god 原来门面模式是这么一回事)

  每个书里面都有自己的例子, 但是作为一个游戏开发者, 我会给出的是我做过的用在游戏中的例子

  我所做的游戏里面社交一块的关系又,好友,结拜 和结婚。

  我们以两个人要结婚为例子。结婚的需求是两个人必须是好友,但是两个人不能有结拜关系。

  这是一个社交关系的子系统,跟其他的系统没有什么关系,也是使用门面模式的最佳场合。

  

  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代码如下

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;
    }
}

最后一个类为门面类 , 也就是子系统提供服务的接口类 , 由于代码简单,所以没有用接口 ,但是在实际编程的时候,请面向接口编程, 这是个好习惯

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如何变化, 只要不影响到结拜对象 ,可以自由活动

提高了安全性, 不通过门面 休想访问子系统里面的任何东西。

门面模式的缺点是 违背了开闭原则 , 当系统出现错误的时候 无法通过 继承 覆写解决  唯一能做的是修改门面模式的 代码

门面模式,代理模式,访问者模式   都是通过间隔的使用代理的类调用实际的类的方法 实现解耦。

学习之余的笔记,只是对自己学习的一个总结,不具备很强的学术性,  看看 罢了= = 

原文地址:https://www.cnblogs.com/wzforgame/p/3770707.html