设计模式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来帮我开关硬件设备,而无需关心细节。

也就是对于普通投资者来说,我只需关心基金的盈利情况,而无需关心具体投资组合!

经典的三层构架模式,就是外观模式的一种体现,当然三层模式耦合性还是太高,需要通过接口以及其他模式做进一步的分解。

时间: 2024-10-28 23:50:29

设计模式9---外观模式的相关文章

【设计模式】外观模式

外观模式:它为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用.这其实就是一个分层的思想,将较低层复杂的操作交由较高层同一管理,并向用户程序提供简单易用的接口.下面是一个用C++编写的外观模式的例子. #include <iostream> #include <string> using namespace std; // 键盘类 class Keyboard { public: string Type(const string &input) { retur

设计模式之外观模式(Facade)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

【设计模式】——外观模式

外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式结构图: 代码模板: //四个子系统的类class SubSystemOne{public:    void MethodOne()    {        cout << "子系统方法一" << endl;    }};class SubSystemTwo{public:    void MethodTwo()    {  

设计模式之外观模式(九)

设计模式之外观模式 一.引言 当一个复杂的系统由多个复杂的子系统构成,然后客户端调用会调用多个子系统.这时,客户端会和多个子系统耦合在一起,当子系统需要扩展或者改变时,客户端也要随之改变,我们可以使用外观模式将客户端和子系统进行解耦. 二.介绍 意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口. 何时使用: 1.客户端不需要知道系统内部的复杂联系,整个系统只需提供

C#设计模式(11)——外观模式(Facade Pattern)

一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 "门面"模式.下面就具体介绍下外观模式. 二.外观模式的详细介绍 2.1 定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用.使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内

java设计模式之外观模式(门面模式)

针对外观模式,在项目开发和实际运用中十分频繁,但是其极易理解,下面就简要介绍一下. 一.概念介绍 外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口.这种类型的设计模式属于结构性模式.为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用. 二.角色及使用场景 简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用.这个模式中,设计到3个角色. 1).门面角色:外观模式的核心.它被客户角色调用,它熟悉子系统的功

11.设计模式_外观模式

一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 "门面"模式.下面就具体介绍下外观模式. 二.外观模式的详细介绍 2.1 定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用.使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内

Head First设计模式之外观模式

一.定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用. 外观模式不只是简化了接口,也将客户从组件的子系统中解耦. 外观和适配器可以包装许多类,但是外观强调的是简化接口,而适配器是为了将接口转换成不同的接口. 二.结构 外观角色(Facade):是模式的核心,他被客户client角色调用,知道各个子系统的功能.同时根据客户角色已有的需求预订了几种功能组合子系统角色(Subsystem classes):实现子系统的功能,并处理由Facade

设计模式(外观模式)

外观模式(Facade)是运用比较多的一种设计模式,简单而言就是将多个子系统的能力封装后对外暴露,即将子系统的功能组合成一个复杂功能.如下图: SystemFacade public class SystemFacade { private OneSystem one; private TwoSystem two; public SystemFacade(){ one = new OneSystem(); two = new TwoSystem(); } public void doJob(){

Java 设计模式:外观模式Facade

Facade 外观模式 外观模式----为子系统的一组接口提供一个统一的界面,此模式定义了一个更高层的接口,这一接口使得子系统更容易使用. 借用<大话设计模式>中的例子:市场上有N多只股票,当股民想要买股票时为了最大化自己的收益需要考察市面上很多种类的股票,然后根据自己的判断选取几只股票组合购买(这种场景下每一只股票都是可以单独购买的,用户需要考察.选取一组股票来一起购买).而有的用户直接购买基金,基金的作用是帮用户选取几只股票来组合购买,用户不用自己去选取多只股票. 在这个场景下:单独的购买