设计模式学习笔记(十一)——Facade外观模式

转载 2007年09月18日 11:48:00

Facade外观模式,是一种结构型模式,它主要解决的问题是:组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。在这里我想举一个例子:比如,现在有一辆汽车,我们(客户程序)要启动它,那我们就要发动引擎(子系统1),使四个车轮(子系统2)转动。但是实际中我们并不需要用手推动车轮使其转动,我们踩下油门,此时汽车再根据一些其他的操作使车轮转动。油门就好比系统给我们留下的接口,不论汽车是以何种方式转动车轮,车轮变化成什么牌子的,我们要开走汽车所要做的还是踩下油门。

GoF《设计模式》中说道:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

Façade外观模式的结构大概是这样的:

       这个图是我对Facade模式的理解,如果大家觉得有什么不对的地方欢迎给我指出。

       我就上面说的那个情形写一下实现代码,首先我们要实现三个子系统(WheelEngineBody):

       internal class Engine

    {

        public string EngineWork()

        {

            return "BMW's Engine is Working";

        }

 

        public string EngineStop()

        {

            return "BMW's Engine is stoped";

        }

    }

 

    internal class Wheel

    {

        public string WheelCircumrotate()

        {

            return "BMW's Wheel is Circumrotating";

        }

 

        public string WheelStop()

        {

            return "BMW's Wheel is stoped";

        }

    }

   

    internal class Body

    {

        public Wheel[] wheels = new Wheel[4];

        public Engine engine = new Engine();

        public Body()

        {

            for (int i = 0; i < wheels.Length; i++)

            {

                wheels[i] = new Wheel();

            }

        }

}

 

然后,我们再来实现汽车的Facade

class CarFacade

    {

        Body body = new Body();

 

        public void Run()

        {

            Console.WriteLine(body.engine.EngineWork());

            for(int i = 0; i < body.wheels.Length; i++)

            {

                Console.WriteLine(body.wheels[i].WheelCircumrotate());

            }

        }

 

        public void Stop()

        {

            Console.WriteLine(body.engine.EngineStop());

            for (int i = 0; i < body.wheels.Length; i++)

            {

                Console.WriteLine(body.wheels[i].WheelStop());

            }

        }

}

 

现在我们来使用客户端程序验证一下,代码如下:

class Program

    {

        static void Main(string[] args)

        {

            CarFacade car = new CarFacade();

            car.Run();

            car.Stop();

            Console.Read();

        }

}

      

       执行结果如下;

       BMW's Engine is Working

BMW's Wheel is Circumrotating

BMW's Wheel is Circumrotating

BMW's Wheel is Circumrotating

BMW's Wheel is Circumrotating

BMW's Engine is stoped

BMW's Wheel is stoped

BMW's Wheel is stoped

BMW's Wheel is stoped

BMW's Wheel is stoped

 

正如上面所说:客户端代码(Program)不需要关心子系统,它只需要关心CarFacade所留下来的和外部交互的接口,而子系统是在CarFacade中聚合。

 

Façade模式的几个要点:

       1、从客户程序的角度看,Facade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果——内部子系统的任何变化不会影响到Facade接口的变化。

2Facade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Facade很多时候更是一种架构设计模式。

 

相关文章推荐

Oracle PlSql 问题集锦 - 数字或值错误:字符串缓冲区太小【ORA-06502】

在提交Web Service请求时不宜直接去提交整个CLOB XML请求报文,而用dbms_lob.substr()将CLOB分段去提交XML请求报文是最为稳妥的方法。

用Visual Studio2005创建“MFC智能设备应用程序”项目时,总是出现“脚本错误”

在Visual Studio 2005开发平台(中文版)下,选择“文件”-> “新建”-> “项目”-> “项目类型”中选择“Visual C++”下的“智能设备”,“模板”中选择“MFC智能设备应用...

hand标准化

DO070 Hand_PLSQL_框架_应用指南 概述 本文档详细描述了在   客户化项目开发中SQL/PLSQL的一些规范和开发指南,用于指导开发员遵守开发标准、使用开发...

PLSql -- 递归查询的另几种实现方式(函数/存储过程)

利用函数/存储过程/WITH实现递归查询,这是一个树结构,查询教师“胡明星”的所有主管及姓名:(无主管的教师也需要显示),显示(教师编号、教师名称、主管编号、主管名称)...

Sql -- 练习4 某列部分数据排序(其他默认)

利用分析函数OVER/CASE语句/ORDERBY解决问题:查询所有课程总成绩前三名的按照升序排在最开头,其余数据排序保持默认,显示(学号、成绩、总成绩)

Sql -- 练习3 递归查询

这是一个树结构,查询教师“胡明星”的所有主管及姓名:(无主管的教师也需要显示),显示(教师编号、教师名称、主管编号、主管名称)

求职简历-Resume

求职简历,软件工程师,web开发人员,系统维护与优化师

PLSql--cursor 显式游标(参数)

两个例子(各部门工资情况分布和总额与各系选修某课程的所有学生成绩分布情况和平均成绩)突出在写PLSQL的思维逻辑的重要性

实现数字电视共享改造工程详细解说

随着国家推进数字电视进程的加快,大中型宾馆酒店为了方便管理、节省费用,开始着手进行有线电视改造,增加自己的有线电视前端。简单来说,就是将一台电视一个机顶盒的收看方式改变为一套节目一个机顶盒。改造之后不...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)