Facade
外
观模式,是一种结构型模式,它主要解决的问题是:组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合
面临很多变化的挑战。在这里我想举一个例子:比如,现在有一辆汽车,我们(客户程序)要启动它,那我们就要发动引擎(子系统
1
),使四个车轮(子系统
2
)转动。但是实际中我们并不需要用手推动车轮使其转动,我们踩下油门,此时汽车再根据一些其他的操作使车轮转动。油门就好比系统给我们留下的接口,不论汽车是以何种方式转动车轮,车轮变化成什么牌子的,我们要开走汽车所要做的还是踩下油门。
GoF
《设计模式》中说道:为子系统中的一组接口提供一个一致的界面,
Facade
模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
Façade
外观模式的结构大概是这样的:
这个图是我对
Facade
模式的理解,如果大家觉得有什么不对的地方欢迎给我指出。
我就上面说的那个情形写一下实现代码,首先我们要实现三个子系统(
Wheel
、
Engine
、
Body
):
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
接口的变化。
2
、
Facade
设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。
Facade
很多时候更是一种架构设计模式。
相关推荐
Facade设计模式在VB数据库中的应用
在软件设计模式的世界里,`Command`(命令)和`Facade`(外观)模式是非常重要的两种设计模式。它们分别服务于不同的目的,但都是为了提高代码的可读性、可维护性和灵活性。 `Command`模式是一种行为设计模式,它将...
总之,Facade设计模式是一种有效的降低复杂度、提高代码可读性和可维护性的手段。它通过提供一个简单的接口,使得客户端可以更容易地使用和理解复杂的系统,从而降低了客户端与子系统之间的耦合度。在面对大型、复杂...
设计模式是软件开发中的重要概念,它是一种在特定场景下解决问题的通用、可重用的设计方案。设计模式的目的是为了提高代码的可读性、可维护性以及系统设计的灵活性。本文将深入探讨FACADE模式、Adapter模式以及...
设计模式之门面模式(Facade模式),介绍门面模式,实际例子分析,代码讲解等
6.1.3 Facade设计模式 6.2 应用Messaging模式 6.2.1 Document Message和 Request-Response模式 6.2.2 Reservation模式 6.2.3 Idempotent模式 6.3 SOA示例 6.3.1 领域模型和资源库 6.3.2 服务层 6.3.3 ...
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要资源分。敬请期待。 这是第11节:结构型...
**外观(Facade)模式**是一种结构型设计模式,它的主要目的是提供一个统一的接口,用于客户端访问复杂的子系统。在大型软件系统中,通常由多个模块或子系统组成,每个子系统都有自己的功能,而客户端可能需要与这些...
在这篇文章中,我们将深入探讨两种常见的设计模式:Facade(外观)模式和Simple Factory(简单工厂)模式。 首先,让我们关注Facade模式。外观模式是一种结构型设计模式,它的主要目标是提供一个统一的接口,用来...
**Session Facade设计模式**是一个单一接口,封装了一组EJB或服务,为客户端提供了一个简单的交互点,降低了客户端与服务器之间的通信复杂性,同时也减少了服务器端的会话管理开销。 **Value List Handler设计模式*...
Laravel的Facade设计模式是其强大功能的一部分,它使得开发者可以简单地调用服务容器中的服务,而无需实例化对象。下面将详细介绍这个主题。 **1. Facade原理** Laravel的Facade实际上是一个静态代理,它在幕后通过...
外观模式(Facade Pattern)是设计模式中的一种结构型模式,主要目的是为了解决复杂的系统接口问题,提供一个简单的统一入口,使得客户端可以更方便地使用系统。在Java中,外观模式通常用来隐藏系统的复杂性,对外只...
**外观模式(Facade Pattern)**是面向对象设计模式中的一种结构型模式,它提供了一个统一的接口,用于访问子系统中的各个部分。在C#编程中,外观模式可以帮助我们简化复杂的系统接口,使得客户端代码与复杂的内部...
### C#面向对象设计模式纵横谈(11):Facade 外观模式(结构型模式) #### 一、概述 本篇文章将深入探讨C#面向对象设计模式中的Facade外观模式,这是一种结构型模式,旨在通过提供一个统一的接口来简化复杂的子系统。...
Facade模式,又称为外观模式,是设计模式中的一种结构型模式。在软件工程中,它为子系统提供了一个统一的入口,简化了客户端对复杂子系统的访问,使得客户端无需了解子系统内部的具体实现细节。Facade模式通常应用于...
外观模式是23种设计模式中的一种,属于结构型模式。它的主要目的是为一组复杂的子系统提供一个简单的接口。在PHP设计中,外观模式经常被用于简化复杂的系统结构,使得客户端(用户代码)可以忽略系统内部复杂的操作...
设计模式是软件工程中的一种重要思想,它是在特定情境下,为解决常见问题而形成的一套最佳实践。在本文中,我们将深入探讨24种设计模式,并结合混合设计模式的概念,以及它们在实际项目中的应用案例。 首先,设计...