GOF之外观模式

系统的复杂度:

假设我们需要开发一个坦克模拟系统用于坦克车的各种作战环境中的行为,其中坦克引擎、控制器、车轮、车身等子系统构成。

方案:

动机(Motivation)

上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多地耦合,随着外部客户程序和各子系统的演化,这种过多地耦合面临很多变化的挑战。

意图(Intent)

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

结构(Structure)

代码实现:

 1 内部类
 2  internal class Wheel
 3     {
 4         private int _num;
 5
 6         public int Num
 7         {
 8             get { return _num; }
 9             set { _num = value; }
10         }
11         public Wheel(int num)
12         {
13             this.Num = num;
14         }
15         public void WAction()
16         {
17             Console.WriteLine("轮子{0}工作",this.Num);
18         }
19     }
20     internal class Engine
21     {
22         private int _num;
23
24         public int Num
25         {
26             get { return _num; }
27             set { _num = value; }
28         }
29         public Engine(int num)
30         {
31             this.Num = num;
32         }
33         public void EAction()
34         {
35             Console.WriteLine("引擎{0}工作",this.Num);
36         }
37     }
38     internal class Bobywork
39     {
40         private int _num;
41
42         public int Num
43         {
44             get { return _num; }
45             set { _num = value; }
46         }
47         public Bobywork(int num)
48         {
49             this.Num = num;
50         }
51         public void BAction()
52         {
53             Console.WriteLine("车身{0}工作",this.Num);
54         }
55     }
56     internal class Controller
57     {
58         private int _num;
59
60         public int Num
61         {
62             get { return _num; }
63             set { _num = value; }
64         }
65         public Controller(int num)
66         {
67             this.Num = num;
68         }
69         public void CAction()
70         {
71             Console.WriteLine("控制器{0}工作",this.Num);
72         }
73     }
 1 高层接口
 2 public class TankFacade
 3     {
 4         private Wheel[] wheels=new Wheel[4]{
 5             new Wheel(1),
 6             new Wheel(2),
 7             new Wheel(3),
 8             new Wheel(4)
 9         };
10         private Engine[] engines = new Engine[2]{
11             new Engine(1),
12             new Engine(2)
13         };
14         private Bobywork bodywork=new Bobywork(1);
15         private Controller controller=new Controller(1);
16         public void Run()
17         {
18             foreach (Wheel item in wheels)
19             {
20                 item.WAction();
21             }
22             foreach (Engine item in engines)
23             {
24                 item.EAction();
25             }
26             bodywork.BAction();
27         }
28         public void Shot()
29         {
30             foreach (Engine item in engines)
31             {
32                 item.EAction();
33             }
34             bodywork.BAction();
35             controller.CAction();
36         }
37     }
1 主函数的调用
2  static void Main(string[] args)
3         {
4             TankFacade facade = new TankFacade();
5             facade.Run();
6             Console.WriteLine("--------------------");
7             facade.Shot();
8             Console.ReadKey();
9         }

Facade模式的几个要点:

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

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

注意区分Facade模式、Adapter模式、Bridge模式与Decorator模式。Facade模式注重简化接口,Adapter模式注重转换接口,Bridge模式注重分离接口(抽象)与其实现,Decorator模式注重稳定接口的前提下为对象扩展功能。

时间: 2024-11-08 19:52:17

GOF之外观模式的相关文章

GOF设计模式(10)外观模式

简介 一.定义 1.概念 外观(Facade)模式:外部与一个子系统的通信通过一个统一的外观角色进行,为子系统中的一组接口提供一个一致的入口,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 2.理解 外观类维护要用的子系统的引用,提供一个对外的统一的访问接口,在这个接口里对要用的子系统的接口方法进行调用: 二.组件 Facade(外观角色):在客户端可以调用它的方法,在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任:在正常情况下,它将所有从客户端发来的请求委派到相应

Facade——外观模式

Facade外观模式,也是比较常用的一种模式,基本上所有软件系统中都会用到. GOF 在<设计模式>一书中给出如下定义:为子系统中的一组接口提供一个一致的界面, Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.简单说,就是将复杂的逻辑封装起来,对外公开简单的接口,由客户程序调用.客户对象通过一个外观接口读写子系统中各接口的数据资源. 适用情景: (1)设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式. (2)开发阶段,子系统越来越复杂,增加外观模式提供一

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

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

24天学会设计模式----门面模式(外观模式)

一.门面模式 1.定义 GOF<设计模式>一书对Facade模式是这样描述的: 为子系统中的一组接口提供一个统一接口.Facade模式定义了一个更高层的接口,使子系统更加容易使用. 2.结构 门面角色:客户端可以调用这个角色的方法.此角色知道子系统的功能和责任.在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统中去. 子系统角色:可以同时有一个或者多个子系统.每一个子系统都不是一个单独的类,而是一个类的集合.每个子系统都可以被客户端直接调用,或者被门面角色调用. 3.适用性 (1

第10章 外观模式(Fa?ade Pattern)

原文   第10章 外观模式(Fa?ade Pattern) 概述:   在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化.那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦?这就是要说的Fa?ade 模式. 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.[GOF <设计模式>] 结构图: 这里在附上一个有助于理解的图 未使用外观

NET设计模式 第二部分 结构性模式(11):外观模式(Fa&#231;ade Pattern)

外观模式(Façade Pattern) ——.NET设计模式系列之十二 Terrylee,2006年3月 概述 在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化.那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦?这就是要说的Façade 模式. 意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.[GOF <设计模式>] 示意

.NET设计模式(12):外观模式(Fa&#231;ade Pattern)(转)

概述 在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化.那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦?这就是要说的Façade 模式. 意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.[GOF <设计模式>] 示意图 门面模式没有一个一般化的类图描述,下面是一个示意性的对象图: 图1 Façade模式示意性对象图 生活中

[设计模式] 外观模式facade

外观模式应该是用的很多的一种模式,特别是当一个系统很复杂时,系统提供给客户的是一个简单的对外接口,而把里面复杂的结构都封装了起来.客户只需使用这些简单接口就能使用这个系统,而不需要关注内部复杂的结构.DP一书的定义:为子系统中的一组接口提供一个一致的界面, 外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.举个编译器的例子,假设编译一个程序需要经过四个步骤:词法分析.语法分析.中间代码生成.机器码生成.学过编译都知道,每一步都很复杂.对于编译器这个系统,就可以使用外观模式.可以定义

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

原文:C#设计模式之十外观模式(Facade Pattern)[结构型] 一.引言 快12点半了,要开始今天的写作了.很快,转眼设计模式已经写了十个了,今天我们要讲[结构型]设计模式的第五个模式,该模式是[外观模式],英文名称是:Facade Pattern.我们先从名字上来理解一下"外观模式".我看到了"外观"这个词语,就想到了"外表"这个词语,两者有着很相近的意思.就拿谈恋爱来说,"外表"很重要,如果第一眼看着很舒服.有眼