• 门面模式


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

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

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

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

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

  • 相关阅读:
    poj1019——log10求位数
    poj2084——卡特兰数
    hdoj1023——卡特兰数
    poj1496——组合数学
    poj1850——组合数学
    bestcoder#29 1002 矩阵连乘快速幂解fib数列
    bestcoder#28 1002 dfs
    poj1458——dp,lcs
    hduoj1106
    codeforces#296div2_b 字符串,图
  • 原文地址:https://www.cnblogs.com/wzforgame/p/3770707.html
Copyright © 2020-2023  润新知