门面模式(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如何变化, 只要不影响到结拜对象 ,可以自由活动
提高了安全性, 不通过门面 休想访问子系统里面的任何东西。
门面模式的缺点是 违背了开闭原则 , 当系统出现错误的时候 无法通过 继承 覆写解决 唯一能做的是修改门面模式的 代码
门面模式,代理模式,访问者模式 都是通过间隔的使用代理的类调用实际的类的方法 实现解耦。
学习之余的笔记,只是对自己学习的一个总结,不具备很强的学术性, 看看 罢了= =