Facade模式,又叫做窗口模式,指的是针对于庞大的类之间错综复杂的关系而提出的一种想法,就相当于我们开发web应用程序的时候使用的controller,service,dao层一样,把底部的与数据库交互的类以及对数据进行操作的类给封装起来,对外只提供contorller的数据接口,而这个controller就相当于是一个窗口。所以,我觉得,窗口模式,更多的是一种思维方式,同样的工具类的思维方式也是同这个相似。
下面就这种思维方式,提供一个具体的实例:设计了一个数字计算器,可以将数字转换成字符串。(这只是随便写的,只是为了展示facade模式的功能,并没有很认真。)
- Calculator类,就相当于是窗口
package site.wangxin520.gof.facade.damo; /** * 自定义的一个计算器的类,这个类只负责对外提供一个运算方法 * @author wangXgnaw * */ public class Calculator { private Calculator(){} /** * * @param num */ public static String operate(int num){ int operator = NumOperator.operator(num); String exchange = Exchange.exchange(operator); return exchange; } }
- NumOperator数字操作类
package site.wangxin520.gof.facade.damo; /** * 对数字进行操作 * * @author wangXgnaw * */ public class NumOperator { private NumOperator() { } /** * 对外提供对数字进行操作的方法 * * @param num * 提供一个数字 * @return int 返回一个新的数字 */ public static int operator(int num) { num = num * 3; num = num + 10086; return num; } }
- Exchange数字转换类
package site.wangxin520.gof.facade.damo; /** * 将数字转换成字符串的操作 * @author wangXgnaw * */ public class Exchange { private Exchange(){} private static String[] arr={"亲亲","猪头","么么哒","爱你","哈哈","傻了么","略略略","吻你","好","不要"}; /** * 将数字转换成字符串 * @param num 数字 * @return String 字符串 */ public static String exchange(int num){ StringBuilder sb=new StringBuilder(); String string=num+""; for (int i = 0; i < string.length(); i++) { num = Integer.parseInt(string.charAt(i)+""); sb.append(arr[num]); } return sb.toString(); } }
- 测试类
package site.wangxin520.gof.facade.damo; /** * 窗口模式的一个测试类 * @author wangXgnaw * */ public class Test { public static void main(String[] args) { //只调用了计算器类里面的一个方法,便可以获得想要的字符串,省去了调用其他接口的操作。 String operate = Calculator.operate(8500); System.out.println(operate); } }
- 结果
可以看到,数字被成功转换成了字符串。
虽然实例很无语,但是这个模式的功能还是比较好的,对于我们测试类的调用,只调用了一个方法,而这个方法里面调用了其他方法我们就不用关心,大大的简便了我们的操作。所以,窗口模式这种思维方法,应当深深的印到我们的脑海中!