设计模式学习笔记(十一)——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很多时候更是一种架构设计模式。

 

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

设计模式学习笔记——外观(Facade)模式@(设计模式)[设计模式, 外观模式, facade]设计模式学习笔记外观Facade模式 基本介绍 外观案例 类图 实现代码 Database类 mail...

【设计模式】学习笔记10:外观模式(Facade)

上一次我们已经知道了适配器模式是如何将一个类的接口转换成另一个符合客户期望的接口了。Java中要做到这一点,必须将一个不兼容接口的对象包装起来,变成兼容的对象。 这次要学的是外观模式. 外观模式是将一...

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

GOF《设计模式》一书对Facade模式是这样描述的:        为子系统中的一组接口提供一个统一接口。Facade模式定义了一个更高层的接口,使子系统更加容易使用。        大致意思是...

设计模式学习笔记十三:外观模式(Facade Pattern)

设计模式学习笔记十三:外观模式(Facade Pattern)      1.概述      外观模式(Façade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层的接口,这个...

C#设计模式之十一外观模式(Facade)【结构型】

一、引言    快12点半了,要开始今天的写作了。很快,转眼设计模式已经写了十个了,今天我们要讲【结构型】设计模式的第五个模式,该模式是【外观模式】,英文名称是:Facade Pattern。我...

设计模式学习——外观模式(Facade)

此文章为本人看了程杰编写的《大话设计模式》后所写的学习笔记,所涉及代码大部分来自书籍,也有本人原创代码。 定义:为子系统中的的一组接口提供一个统一的界面,此模式定义了一个高层接口,这个接口使得这一子系...

设计模式——学习笔记——门面模式Facade——基础篇

门面设计模式有很多的应用场景(以后用Facade代替,显得洋气一些:-D),如Tomcat中就有很多的门面设计模式的体现。而为什么需要使用门面设计模式呢?在我看来,就好比一个两个国家要进行交流,没有必...

学习笔记——JAVA设计模式<10>外观模式

外观模式迪米特法则(最少知识原则) 一个软件的实体应当尽可能少的与其他实体发生互相作用外观模式核心 为子系统提供统一的入口。封装子系统的复杂性,便于客户端调用。模拟注册公司pack...

八、外观模式——设计模式学习笔记

外观模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。...

[设计模式整理笔记 九] 外观模式(Facade)

外观模式的设计是十分简单的,就是对一个对象进行包装,对外的的接口统一由外观类来进行提供。 主要由三部分组成:抽象外观类,具体外观类,其它使用者。例如:在上面的计算工资模块中, 不单单是一个系统需要个人...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式学习笔记(十一)——Facade外观模式
举报原因:
原因补充:

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