打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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很多时候更是一种架构设计模式。

posted on 2006-07-10 08:46 KiddLee 阅读(2129) 评论(14)  编辑 收藏 引用 网摘 所属分类: 设计模式

FeedBack:
# 
bu cuo  回复  更多评论
  
# re: 设计模式学习笔记(十一)——Facade外观模式  2006-07-10 11:07 LED
hao  回复  更多评论
  
# re: 设计模式学习笔记(十一)——Facade外观模式  2006-07-11 11:44 未倾城
# re: 设计模式学习笔记(十一)——Facade外观模式  2006-07-11 16:43 大雁
不错,只是ClientApp 和facadeClass之间应该是箭头而不是聚集符号  回复  更多评论
  
# re: 设计模式学习笔记(十一)——Facade外观模式  2006-07-11 20:32 kid_li
@大雁
我不是很会画UML图,可不可以画一张用Email(kid_li@126.com)发给我给我学习一下  回复  更多评论
  
# re: 设计模式学习笔记(十一)——Facade外观模式  2006-07-12 17:47 同舟共济
好东西  回复  更多评论
  
# re: 设计模式学习笔记(十一)——Facade外观模式  2006-07-18 08:46 大雁
你的这种画法,也是正确的,因为可以采用聚集的关联来使用FacadeClass,但这种方式并不是唯一的。所以我认为简单的调用关系可能更加普遍一些。  回复  更多评论
  
# re: 设计模式学习笔记(十一)——Facade外观模式  2006-12-05 16:39 ww[匿名]
不错,自己的理解。  回复  更多评论
  
# re: 设计模式学习笔记(十一)——Facade外观模式  2007-03-03 13:52 snow_man2004
很好,谢谢!  回复  更多评论
  
# [Anytao.NET] 必须知道的设计模式[TrackBack] 2007-03-21 10:26 Anytao
发布日期:2007.3.21作者:Anytao  查看原文  回复  更多评论
  
# [导入][Anytao.NET] 必须知道的设计模式[TrackBack] 2007-04-07 16:31 Evily.Win
发布日期:2007.3.21作者:Anytao  查看原文  回复  更多评论
  
# [转] 必须知道的设计模式 [TrackBack] 2007-05-05 13:56 酷咖啡
本文将介绍以下内容:  查看原文  回复  更多评论
  
# [Anytao.NET] 必须知道的设计模式(转载)[TrackBack] 2007-05-26 09:30 念时
[Anytao.NET]必须知道的设计模式  查看原文  回复  更多评论
  
# re: 设计模式学习笔记(十一)——Facade外观模式  2007-07-19 23:18 dezwen
大致理解,以下是Sina播客里有关Facade外观模式的视频,大家一起参考:
http://you.video.sina.com.cn/b/4735243-1294306030.html  回复  更多评论
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
深入理解JavaScript系列(30):设计模式之外观模式
设计模式之Facade--外观模式
设计模式——门面模式(Facade)
C#面向对象设计模式纵横谈:Facade 外观模式
设计模式之外观模式(门面模式)
Java 设计模式——外观模式
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服