C# 设计模式–外观模式(Facade)

     一个良好的面向对象应用程序应该是一个最小的类,这个类能够把其他可重用类的行为有效的组织起来。对一个子系统的类进行重构,直到每个类都有一个进行良好定义功能目标,所以代码易于维护。外观模式(Facade)的目的是提供一个接口,通过这个接口可以使一个子系统更容易使用。它(Facade)将客户的请求代理给适合的子系统对象。客户通过发送请求给(Facade)的方式与子系统通信。使用(Facade)的客户不需要直接访问子系统对象。 它对客户屏蔽了子系统组件,减少了客户处理的对象的数目。(1)

C# 设计模式–外观模式(Facade)插图

(Facade)模式示意性对象图(2)

代码如下:

C# 设计模式–外观模式(Facade)插图1
using
 System;
C# 设计模式–外观模式(Facade)插图1

using
 System.Collections.Generic;
C# 设计模式–外观模式(Facade)插图1

using
 System.Text;
C# 设计模式–外观模式(Facade)插图1
C# 设计模式–外观模式(Facade)插图1

namespace
 Facade
C# 设计模式–外观模式(Facade)插图2C# 设计模式–外观模式(Facade)插图3


{
C# 设计模式–外观模式(Facade)插图4
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6    
/**//// <summary>
C# 设计模式–外观模式(Facade)插图4    
/// 子系统一,该子系统仅含有一个类
C# 设计模式–外观模式(Facade)插图7    
/// </summary>

C# 设计模式–外观模式(Facade)插图4    public class DrawLine
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6    
{
C# 设计模式–外观模式(Facade)插图4        
private int _point;
C# 设计模式–外观模式(Facade)插图4
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6        
/**//// <summary>
C# 设计模式–外观模式(Facade)插图4        
/// 构造函数
C# 设计模式–外观模式(Facade)插图4        
/// </summary>
C# 设计模式–外观模式(Facade)插图7        
/// <param name=”point”>画线的数量</param>

C# 设计模式–外观模式(Facade)插图4        public DrawLine(int point)
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6        
{
C# 设计模式–外观模式(Facade)插图4            
this._point = point;
C# 设计模式–外观模式(Facade)插图7        }

C# 设计模式–外观模式(Facade)插图4
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6        
/**//// <summary>
C# 设计模式–外观模式(Facade)插图4        
/// 画下划线
C# 设计模式–外观模式(Facade)插图7        
/// </summary>

C# 设计模式–外观模式(Facade)插图4        public void DrawUnderline()
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6        
{
C# 设计模式–外观模式(Facade)插图4            
for (int i = 0; i < _point; i++)
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6            
{
C# 设计模式–外观模式(Facade)插图4                Console.WriteLine(
_);
C# 设计模式–外观模式(Facade)插图7            }

C# 设计模式–外观模式(Facade)插图7        }

C# 设计模式–外观模式(Facade)插图4
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6        
/**//// <summary>
C# 设计模式–外观模式(Facade)插图4        
/// 画中划线
C# 设计模式–外观模式(Facade)插图7        
/// </summary>

C# 设计模式–外观模式(Facade)插图4        public void DrawMiddleline()
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6        
{
C# 设计模式–外观模式(Facade)插图4            
for (int i = 0; i < _point; i++)
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6            
{
C# 设计模式–外观模式(Facade)插图4                Console.WriteLine(
);
C# 设计模式–外观模式(Facade)插图7            }

C# 设计模式–外观模式(Facade)插图7        }

C# 设计模式–外观模式(Facade)插图7    }

C# 设计模式–外观模式(Facade)插图4
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6    
/**//// <summary>
C# 设计模式–外观模式(Facade)插图4    
/// 子系统二,该子系统也仅含有一个类
C# 设计模式–外观模式(Facade)插图7    
/// </summary>

C# 设计模式–外观模式(Facade)插图4    public class ShowData
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6    
{
C# 设计模式–外观模式(Facade)插图4        
private string  _defaultValue;
C# 设计模式–外观模式(Facade)插图4
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6        
/**//// <summary>
C# 设计模式–外观模式(Facade)插图4        
/// 构造函数
C# 设计模式–外观模式(Facade)插图4        
/// </summary>
C# 设计模式–外观模式(Facade)插图7        
/// <param name=”defaultValue”>默认值</param>

C# 设计模式–外观模式(Facade)插图4        public ShowData(string defaultValue)
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6        
{
C# 设计模式–外观模式(Facade)插图4            
this._defaultValue = defaultValue;
C# 设计模式–外观模式(Facade)插图7        }

C# 设计模式–外观模式(Facade)插图4
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6        
/**//// <summary>
C# 设计模式–外观模式(Facade)插图4        
/// 显示详细的数据
C# 设计模式–外观模式(Facade)插图4        
/// </summary>
C# 设计模式–外观模式(Facade)插图4        
/// <param name=”time”>参数一</param>
C# 设计模式–外观模式(Facade)插图7        
/// <param name=”outsideValue”>参数二</param>

C# 设计模式–外观模式(Facade)插图4        public void ShowParticularData(int time, string outsideValue)
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6        
{
C# 设计模式–外观模式(Facade)插图4            
for (int i = 0; i < time; i++)
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6            
{
C# 设计模式–外观模式(Facade)插图4                Console.WriteLine(outsideValue);
C# 设计模式–外观模式(Facade)插图4                Console.WriteLine(
|);
C# 设计模式–外观模式(Facade)插图7            }

C# 设计模式–外观模式(Facade)插图4            Console.WriteLine(
);
C# 设计模式–外观模式(Facade)插图7        }

C# 设计模式–外观模式(Facade)插图4
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6        
/**//// <summary>
C# 设计模式–外观模式(Facade)插图4        
/// 显示简单的数据
C# 设计模式–外观模式(Facade)插图4        
/// </summary>
C# 设计模式–外观模式(Facade)插图7        
/// <param name=”outsideValue”></param>

C# 设计模式–外观模式(Facade)插图4        public void ShowShortData(string outsideValue)
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6        
{
C# 设计模式–外观模式(Facade)插图4            Console.WriteLine(_defaultValue 
+ : + outsideValue);
C# 设计模式–外观模式(Facade)插图7        }

C# 设计模式–外观模式(Facade)插图7    }

C# 设计模式–外观模式(Facade)插图4
C# 设计模式–外观模式(Facade)插图4    
//使用外观模式,向外提供各个子系统的功能
C# 设计模式–外观模式(Facade)插图4
    public class Facade
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6    
{
C# 设计模式–外观模式(Facade)插图4        
private int _times;
C# 设计模式–外观模式(Facade)插图4        
private string _defaultValue;
C# 设计模式–外观模式(Facade)插图4        
private DrawLine dl;
C# 设计模式–外观模式(Facade)插图4        
private ShowData sd;
C# 设计模式–外观模式(Facade)插图4
C# 设计模式–外观模式(Facade)插图4        
public Facade(int times, string defaultValue)
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6        
{
C# 设计模式–外观模式(Facade)插图4            _times 
= times;
C# 设计模式–外观模式(Facade)插图4            _defaultValue 
= defaultValue;
C# 设计模式–外观模式(Facade)插图4            dl 
= new DrawLine(_times);
C# 设计模式–外观模式(Facade)插图4            sd 
= new ShowData(_defaultValue); 
C# 设计模式–外观模式(Facade)插图7        }

C# 设计模式–外观模式(Facade)插图4
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6        
/**//// <summary>
C# 设计模式–外观模式(Facade)插图4        
/// 完成任务一:画下划线,显示详细的数据
C# 设计模式–外观模式(Facade)插图7        
/// </summary>

C# 设计模式–外观模式(Facade)插图4        public void DrawPicture()
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6        
{
C# 设计模式–外观模式(Facade)插图4            dl.DrawUnderline();
C# 设计模式–外观模式(Facade)插图4            sd.ShowParticularData(_times, _defaultValue); 
C# 设计模式–外观模式(Facade)插图7        }

C# 设计模式–外观模式(Facade)插图4
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6        
/**//// <summary>
C# 设计模式–外观模式(Facade)插图4        
/// 完成任务二:画中划线,显示简单的数据
C# 设计模式–外观模式(Facade)插图7        
/// </summary>

C# 设计模式–外观模式(Facade)插图4        public void DrawImage()
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6        
{
C# 设计模式–外观模式(Facade)插图4            dl.DrawMiddleline();
C# 设计模式–外观模式(Facade)插图4            sd.ShowShortData(_defaultValue);
C# 设计模式–外观模式(Facade)插图7        }

C# 设计模式–外观模式(Facade)插图4
C# 设计模式–外观模式(Facade)插图7    }

C# 设计模式–外观模式(Facade)插图4
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6    
/**//// <summary>
C# 设计模式–外观模式(Facade)插图4    
/// 客户类
C# 设计模式–外观模式(Facade)插图7    
/// </summary>

C# 设计模式–外观模式(Facade)插图4    public class Client
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6    
{
C# 设计模式–外观模式(Facade)插图4        
private const int _times = 10;
C# 设计模式–外观模式(Facade)插图4        
private const string _defaultValue = 默认值;
C# 设计模式–外观模式(Facade)插图4
C# 设计模式–外观模式(Facade)插图4        
static void Main(string[] args)
C# 设计模式–外观模式(Facade)插图5C# 设计模式–外观模式(Facade)插图6        
{
C# 设计模式–外观模式(Facade)插图4            
//———- 非使用Facade模式时,常见的用法——————–
C# 设计模式–外观模式(Facade)插图4
            Console.WriteLine(非使用Facade模式时,常见的用法. );
C# 设计模式–外观模式(Facade)插图4            DrawLine dl 
= new DrawLine(_times);
C# 设计模式–外观模式(Facade)插图4            ShowData sd 
= new ShowData(_defaultValue);            
C# 设计模式–外观模式(Facade)插图4            dl.DrawUnderline();
C# 设计模式–外观模式(Facade)插图4            dl.DrawMiddleline();            
C# 设计模式–外观模式(Facade)插图4            sd.ShowParticularData(_times, _defaultValue);
C# 设计模式–外观模式(Facade)插图4            sd.ShowShortData(_defaultValue);
C# 设计模式–外观模式(Facade)插图4            
//——————-结束————————————–
C# 设计模式–外观模式(Facade)插图4            
//———- 使用Facade模式的用法——————–
C# 设计模式–外观模式(Facade)插图4
            Console.WriteLine( 使用Facade模式的用法. );
C# 设计模式–外观模式(Facade)插图4            Facade fc 
= new Facade(_times, _defaultValue);
C# 设计模式–外观模式(Facade)插图4            fc.DrawPicture();
C# 设计模式–外观模式(Facade)插图4            fc.DrawImage();
C# 设计模式–外观模式(Facade)插图4            
//——————-结束————————————–
C# 设计模式–外观模式(Facade)插图7
        }

C# 设计模式–外观模式(Facade)插图7    }

C# 设计模式–外观模式(Facade)插图8}

     客户程序与抽象类的实现部分之间存在很大的依赖性,引入Facade将这个子系统与客户以及其他的子系统的分析,可以提供子系统的独立性和可移植性。构建一个层次结构的子系统时使用定义子系统中每层的入口点。如果子系统之间是相互依赖,你可以让它们仅通过进行通信,从而简化了它们之间的依赖关系。(3)

    .NET架构中的外观模式(Facade)(4):

C# 设计模式–外观模式(Facade)插图9



    在这个架构中,总共分为四个逻辑层,分别为:用户层UI,业务外观层Business Façade,业务规则层Business Rule,数据访问层Data Access。其中Business Façade层的职责如下:

(1) 从“用户”层接收用户输入

(2) 如果请求需要对数据进行只读访问,则可能使用“数据访问”层

(3) 将请求传递到“业务规则”层

(4) 将响应从“业务规则”层返回到“用户”层

(5) 在对“业务规则”层的调用之间维护临时状态

    Facade有助于建立层次结构的系统,实现了子系统与客户之间的松耦合关系,子系统内部的功能组件往往是紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。Facade消除了复杂的循环依赖关系。这一点在客户程序与子系统分别实现的时候格外重要。(3) 

参考资料:

(1)《C# 设计模式》《 Desing Patterns in C#》(美)Steven John Metsker 著, 颜炯 译。

(2)http://www.j2medev.com/Article/Class3/pattern/200511/1020.html

(3)设计模式 可复用面向对象软件的基础 Design Patterns Elements of Reusable Object-Oriented Software 》(美)Erich Gamma Richard Helm Ralph Johnson John Vlissides 著,李英军 等译。

(4)http://www.cnblogs.com/Terrylee/archive/2006/03/17/352349.html

标签