zoukankan      html  css  js  c++  java
  • 【转】C#设计模式(外观模式)

    原文地址:http://www.cnblogs.com/tianzhiliang/archive/2011/09/30/2196249.html

    在家庭影院中,有灯光,屏幕,投影机,功放机,DVD 播放器这几个基本的工具:

    1. 灯光,可以关闭灯光和打开灯光。
    2. 投影机,可以打开和关闭投影机。
    3. 屏幕,可以打开和关闭。
    4. 功放机,可以关闭音量和打开音量。
    5. DVD 播放器,可以打开播放器和关闭播放器。

      以最普通的方式实现观看电影,类图如下所示:

      按照类图所示,如果要观看电影,必须在客户端执行下面的操作:先打开投影仪,再打开功放机,再打开屏幕,再打开 DVD 播放机,再打开灯光,在经历了这么多操作后,才可以看一场电影。而在关闭电影的时候,也要先关闭投影仪,再关闭功放机,再关闭屏幕,再关闭 DVD 播放机,再关闭灯光。哦,这是太复杂了!!!在客户端居然有那么多操作,如果有一些用户不知道如何使用其中的一个工具,那他便看不了电影!

      上面其实反映的是现今软件开发系统中的一个比较常见的现象,客户端程序经常和复杂系统的内部子系统产生直接联系,导致客户程序随着子系统的变化而变化。要想解决上面的这一串问题,必须要简化客户程序与子系统之间的交互接口,解除客户程序和子系统之间的耦合,而外观模式正好可以解决这个问题。

      外观模式(Facade)的定义:为子系统中的一组接口提供一个一致的界面,用来访问子系统中的一群接口。

      此模式定义了一个高层的接口,这个接口使得这一子系统更加容易使用。简单的说,就是外观模式将一个或者多个类的复杂的操作进行了隐藏,只显示出一个一致的界面供客户端使用。需要注意的是,外观模式仅仅是给你提供了更为直接和容易的操作方式,它并没有把原来的子系统进行隔离,所以,如果你还需要子系统类的更高层的功能,还是可以使用原来的子系统的,这个是外观模式的一大优点。通过外观模式可以将子系统的多个接口上建立一个高层接口,并且将这个高层接口提供给客户端使用,这样便可以解除掉客户端和复杂子系统之间的耦合。

      

                          外观模式结构图

      通过上图可以看出,外观模式实现提供简单的接口(OpenMovie 和 CloseMovie)给客户端,也给客户端和子系统之间实现了解耦。下面通过代码来实现上面的这个 Demo。

      

      几个播放工具的代码:

    using System;
    namespace Facade 
        /// <summary> 
        /// 投影仪 
        /// </summary> 
        public class Projector 
        
            public void OpenProjector() 
            
                Console.WriteLine("打开投影仪"); 
            }
            public void CloseProjector() 
            
                Console.WriteLine("关闭投影仪"); 
            }
            public void SetWideScreen() 
            
                Console.WriteLine("投影仪状态为宽屏模式"); 
            }
            public void SetStandardScreen() 
            
                Console.WriteLine("投影仪状态为标准模式"); 
            
        
    }
              
               
    using System;
    namespace Facade 
        /// <summary> 
        /// 功放机 
        /// </summary> 
        public class Amplifier 
        
            public void OpenAmplifier() 
            
                Console.WriteLine("打开功放机"); 
            }
            public void CloseAmplifier() 
            
                Console.WriteLine("关闭功放机"); 
            
        
    }
                   
                     
    using System;
    namespace Facade 
        /// <summary> 
        /// 屏幕 
        /// </summary> 
        public class Screen 
        
            public void OpenScreen() 
            
                Console.WriteLine("打开屏幕"); 
            }
            public void CloseScreen() 
            
                Console.WriteLine("关闭屏幕"); 
            
        
    }
                     
                     
    using System;
    namespace Facade 
        /// <summary> 
        /// DVD播放器 
        /// </summary> 
        public class DVDPlayer 
        
            public void OpenDVDPlayer() 
            
                Console.WriteLine("打开 DVD 播放器"); 
            }
            public void CloseDVDPlayer() 
            
                Console.WriteLine("关闭 DVD 播放器"); 
            
        
    }
                     
                   
    using System;
    namespace Facade 
        /// <summary> 
        /// 灯光 
        /// </summary> 
        public class Light 
        
            public void OpenLight() 
            
                Console.WriteLine("打开灯光"); 
            }
            public void CloseLight() 
            
                Console.WriteLine("关闭灯光"); 
            
        
    }

      外观类中的代码:

    namespace Facade 
        /// <summary> 
        /// 定义一个外观 
        /// </summary> 
        public class MovieFacade 
        
            /// <summary> 
            /// 在外观类中必须保存有子系统中各个对象 
            /// </summary> 
            private Projector projector; 
            private Amplifier amplifier; 
            private Screen screen; 
            private DVDPlayer dvdPlayer; 
            private Light light;
            public MovieFacade() 
            
                projector = new Projector(); 
                amplifier = new Amplifier(); 
                screen = new Screen(); 
                dvdPlayer = new DVDPlayer(); 
                light = new Light(); 
            }
            /// <summary> 
            /// 打开电影 
            /// </summary> 
            public void OpenMovie() 
            
                //先打开投影仪 
                projector.OpenProjector(); 
                //再打开功放 
                amplifier.OpenAmplifier(); 
                //再打开屏幕 
                screen.OpenScreen(); 
                //再打开 DVD 
                dvdPlayer.OpenDVDPlayer(); 
                //再打开灯光 
                light.OpenLight(); 
            }
            /// <summary> 
            /// 关闭电影 
            /// </summary> 
            public void CloseMovie() 
            
                //关闭投影仪 
                projector.CloseProjector(); 
                //关闭功放 
                amplifier.CloseAmplifier(); 
                //关闭屏幕 
                screen.CloseScreen(); 
                //关闭 DVD 
                dvdPlayer.CloseDVDPlayer(); 
                //关闭灯光 
                light.CloseLight(); 
            
        
    }

      客户端代码:

    using System;
    namespace FacadeTest 
        class Program 
        
            static void Main(string[] args) 
            
                Facade.MovieFacade movie = new Facade.MovieFacade(); 
                Facade.Projector projector = new Facade.Projector();
                     
                //首先是观看电影 
                movie.OpenMovie();
                Console.WriteLine();
                  
                //然后是将投影仪模式调到宽屏模式 
                projector.SetWideScreen(); 
               //再将投影仪模式调回普通模式 
                projector.SetStandardScreen(); 
                Console.WriteLine();
                
                //最后就是关闭电影了 
                movie.CloseMovie();
                Console.ReadKey(); 
            
        
    }

      从上例中可以看出,可以在客户端中使用子系统中的内容,即外观模式并没有把子系统和客户端隔离开来,只是提供了整洁的接口给客户端,如果客户端想访问复杂子系统中的接口时还是一样的可以访问的。比如在上面的 Demo 中的设置了宽屏和普通等模式。

  • 相关阅读:
    Windows SDK编程(Delphi版) 之 应用基础,楔子
    一个小问题引发的论证思考
    Delphi 组件开发教程指南(7)继续模拟动画显示控件
    用PyInstaller将python转成可执行文件exe笔记
    使用 .Net Memory Profiler 诊断 .NET 应用内存泄漏(方法与实践)
    Microsof Office SharePoint 2007 工作流开发环境搭建
    How to monitor Web server performance by using counter logs in System Monitor in IIS
    LINQ之Order By
    window 性能监视器
    内存泄露检测工具
  • 原文地址:https://www.cnblogs.com/luofuxian/p/2362968.html
Copyright © 2011-2022 走看看