求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
要资料
 
 
 

设计模式教程
简单工厂模式
AbstractFactory模式
FactoryMethod模式
Prototype模式
Singleton模式
Template Method模式
Builder模式
Class-Adapter 模式
Facade 模式
Object-Adapter 模式
Bridge模式
 
 

Facade 模式
1387 次浏览
37次  
来源:火龙果软件   作者:俎涛
 
问题 在一个子系统内,存在多个类能够对外提供服务,这就造成了服务请求者的选择服务的复杂性,并且还会因为服务的增加和减少而引起访问者的变更。
环境 一个子系统内部有多个服务都对外提供服务,一个层次内部有多个模块对上层提供服务。这些被访问的服务具有同样的复用层次,具有类似的功能
解决方案 为子系统的内部多个功能模块提供一个访问门面,由门面提供统一的访问入口,选择内部的功能模块,并返回结果。
效果 封装了同一个子系统或者层次的内部实现,提供了更好的封装性,进而提高了复用性和扩展能力。
实例 Device层次的封装。

结构类图

模式范例

下面对模式给出范例,包括:

  • 需求,采用用例模型描述
  • 设计,包括:设计类图,顺序图。
  • 实现:代码目录。
  • 运行:运行效果界面

用例模型

用例名称 送数据
用例概述 使用各种设备发送数据
基本场景 1 用户启动程序
  1.1系统显示请输入设备类型
2用户输入设备类型
  2.1系统显示请输入发送的数据,
3用户输入数据,回车
  3.1系统显示 该类型的设备正在发送数据
备选场景 在基本流的3.1,如果系统找不到该设备,则显示,对不起..

模式应用说明

采用和模式方案同样的格式,具体化为当前的应用设计。

问题 在一个设备层内,存在多个类(Ehthernet, COM ,USB )能够对外提供服务,这就造成了服务请求者的选择设备服务的复杂性,并且还会因为设备的增加和减少而引起访问者的变更。
环境 设备层次内部有多个模块(Ehthernet, COM ,USB )对上层Computer提供服务。这些被访问的服务具有同样的复用层次,具有类似的功能。
解决方案 为多个设备提供一个统一的门面IO,由门面提供统一的访问入口,选择内部的各种设备,并返回结果。
效果 封装了设备层的内部实现,提供了更好的封装性,进而提高了复用性和扩展能力。
实例 Device层次的封装。

设计类图

顺序图:

代码目录

class EtherNet

    {

        public void Send(string data)

        {

            Console.WriteLine("EtherNet is Sending: {0}", data);

        }

    }

    class COM

    {

        public void Transform(string data)

        {

            Console.WriteLine("COM is Transforming :{0}", data);

        }

    }

    class USB

    {

        public void Transform(string data)

        {

            Console.WriteLine("USB is Transforming :{0}", data);

        }

}

 

//门面,把各种设备封装,对外提供统一的接口

    class IO

    {

         private EtherNet net;

         private COM com;

         private USB usb;

 

        public void Send(string data, string port)

        {

            switch (port)

            {

                case "net":

                    net = new EtherNet();

                    net.Send(data);

                    break;

                case "com":

                    com = new COM();

                    com.Transform(data);

                    break;

                case "usb":

                     usb = new USB();

                    usb.Transform(data);

                    break;

                default:

                    Console.WriteLine(" 对不起,没有此种设备!");

                    break;

            }

        }

    }

    class Computer

    {

        static private IO io;

        [STAThread]

        static void Main(string[] args)

        {

            Console.WriteLine(" 请指定设备端口:");

            string port = Console.ReadLine().ToLower();

 

            Console.WriteLine(" 请输入要发送的数据:");

            string data = Console.ReadLine().ToLower();

            io = new IO();

            io.Send(data, port);

        }

    }

运行效果


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



1387 次浏览
37次
 捐助