设计模式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编辑  收藏  举报

导航