设计模式9---外观模式
外观模式其实是平时一直在使用的,只是很少有人意思到而已。
举例:作为投资者,你有很多选择,可以是股票,房产,黄金,股票也有很多,具体选哪个,抛哪个等等问题。
其实作为普通投资者,根本没有必要的知识和心里素质。
而这时候,你只要选择一个基金,由基金经理代替你来管理这些投资组合。
而这就是一种设计模式:
client端需要某些功能,这些功能在featureA和featureB中实现,而这时候,有facade类来帮助
Client来操作,也就是说,client端根本不需要知道featureA和featureB的存在。
下面以一个常见的操作硬件的engine来做demo。
class VideoPlayer { public void init() { System.out.println("VideoPlayer prepare init done"); } public void openVideo() { System.out.println("VideoPlayer open"); } public void closedVideo() { System.out.println("VideoPlayer clsoed"); } }
private class Flashlight { boolean bStatus = false; public void init() { bStatus = false; System.out.println("flashlight prepare init done"); } public boolean openflashlight() { if(!bStatus) { System.out.println("flashlight open"); bStatus = true; } return true; } public void closeflashlight() { if(bStatus) { System.out.println("flashlight close"); bStatus = false; } } }
以上就是操作flashlight以及videoplay的操作,很简单,实际情况可能是,多个设备在调用这些设备,
而且这些操作也许需要异步来完成。
public class Engine { private Flashlight _mFlashlight = null; private VideoPlayer _mVideoPlayer = null; public Engine() { _mFlashlight = new Flashlight(); _mFlashlight.init(); _mVideoPlayer = new VideoPlayer(); _mVideoPlayer.init(); } public void openFlashlight() { _mFlashlight.openflashlight(); } public void closeFlashlight() { _mFlashlight.closeflashlight(); } public void openVideo() { _mVideoPlayer.openVideo(); } public void closeVideo() { _mVideoPlayer.closedVideo(); } private class Flashlight { boolean bStatus = false; public void init() { bStatus = false; System.out.println("flashlight prepare init done"); } public boolean openflashlight() { if(!bStatus) { System.out.println("flashlight open"); bStatus = true; } return true; } public void closeflashlight() { if(bStatus) { System.out.println("flashlight close"); bStatus = false; } } } }
这些我们可以交给Engine来管理,实际应用中,应该确保engine是调用Flashlight 和videoplayer的唯一入口。
这样engine类才能做到统一管理。而Flashlight 和videoplayer对于UI层应该是透明的。
package com.jayfulmath.designpattern.facade; import com.jayfulmath.designpattern.main.BasicExample; /* 外观模式经常用到,比如我们经常会把对硬件的操作(camera,flashlight)等等 * 的操作都会封装在engine类里面,已确保UI层,只需要和engine类通信,而不需要知道 * 具体硬件的操作。 * * */ public class FacadeMain extends BasicExample { @Override public void startDemo() { // TODO Auto-generated method stub Engine mEngine = new Engine(); mEngine.openFlashlight(); mEngine.closeFlashlight(); mEngine.openVideo(); mEngine.closeVideo(); } }
对UI层来说,我只需要通过engine来帮我开关硬件设备,而无需关心细节。
也就是对于普通投资者来说,我只需关心基金的盈利情况,而无需关心具体投资组合!
经典的三层构架模式,就是外观模式的一种体现,当然三层模式耦合性还是太高,需要通过接口以及其他模式做进一步的分解。
posted on 2014-12-01 11:29 Joyfulmath 阅读(171) 评论(0) 编辑 收藏 举报