zoukankan      html  css  js  c++  java
  • 设计模式(C#)——09外观模式

    推荐阅读:

    前言

          在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ”门面“模式。下面就具体介绍下外观模式。

    介绍

          外观模式(Facade Pattern)隐藏系统的复杂性(它向现有的系统添加一个接口,来隐藏系统的复杂性),并向客户端提供了一个客户端可以访问系统的接口。这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。

    外观模式的要素:

    1、外观角色(Facade):客户端通过操作外观角色从而达到控制子系统角色的目的。对于客户端来说,外观角色好比一道屏障,对客户端屏蔽了子系统的具体实现。
    2、子系统角色(SubSystem):表示一个系统的子系统或模块。

    下面举个例子:

          假设一台电脑,它包含了 CPU(处理器),Memory(内存) ,Disk(硬盘)这几个部件,若想要启动电脑,则先后必须启动 CPU、Memory、Disk。但是实际上我们在电脑开/关机时根本不需要去操作这些组件,因为电脑已经帮我们都处理好了,并隐藏了这些东西。这些组件好比子系统角色,而电脑就是一个外观角色。
    下面使用代码来实现外观模式:
    1.创建子系统角色:

     //子系统 CPU
    public class CPU 
    {   
        public void startup()
        {  
            Console.WriteLine("cpu startup!");  
        }  
        public void shutdown()
        {  
            Console.WriteLine("cpu shutdown!");  
        }  
    }
      //子系统 内存
    public class Memory 
    {    
        public void startup()
        {  
            Console.WriteLine("memory startup!");  
        }  
        public void shutdown()
        {  
            Console.WriteLine("memory shutdown!");  
        }  
    } 
     //子系统 硬盘
    public class Disk 
    {  
        public void startup()
        {  
            Console.WriteLine("disk startup!");  
        }  
        public void shutdown()
        {  
            Console.WriteLine("disk shutdown!");  
        }  
    }
    

    2.创建外观角色

    public class Computer {  
        private CPU cpu;  
        private Memory memory;  
        private Disk disk;  
     
        public Computer(){  
            cpu = new CPU();  
            memory = new Memory();  
            disk = new Disk();  
        }  
     
        public void startup(){  
            Console.WriteLine("start the computer!");  
            cpu.startup();  
            memory.startup();  
            disk.startup();  
            Console.WriteLine("start computer finished!");  
        }  
     
        public void shutdown(){  
            Console.WriteLine("begin to close the computer!");  
            cpu.shutdown();  
            memory.shutdown();  
            disk.shutdown();  
            Console.WriteLine("computer closed!");  
        }  
    }
    

    3.使用方法

    	/// <summary>
        /// 不使用外观模式的情况
        /// 此时客户端与三个子系统都发送了耦合,使得客户端程序依赖与子系统
        /// 为了解决这样的问题,我们可以使用外观模式来为所有子系统设计一个统一的接口
        /// 客户端只需要调用外观类中的方法就可以了,简化了客户端的操作
        /// 从而让客户和子系统之间避免了紧耦合
        /// </summary>
        class Client
        {
            static void Main(string[] args)
            {
    			Computer computer = new Computer();  
    			computer.startup();  
    			computer.shutdown();
        	}
        }
    

    4.整合后的代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    namespace 外观模式
    {
        class Program
        {
            static void Main(string[] args)
            {
               Computer computer = new Computer();  
    			computer.startup();  
    			computer.shutdown();
                Console.ReadLine();
            }
        }
    		
         ///////////子系统//////////////
    	 //子系统 CPU
    	public class CPU 
    	{   
    		public void startup()
    		{  
    			Console.WriteLine("cpu startup!");  
    		}  
    		public void shutdown()
    		{  
    			Console.WriteLine("cpu shutdown!");  
    		}  
    	}
    	  //子系统 内存
    	public class Memory 
    	{    
    		public void startup()
    		{  
    			Console.WriteLine("memory startup!");  
    		}  
    		public void shutdown()
    		{  
    			Console.WriteLine("memory shutdown!");  
    		}  
    	} 
    	 //子系统 硬盘
    	public class Disk 
    	{  
    		public void startup()
    		{  
    			Console.WriteLine("disk startup!");  
    		}  
    		public void shutdown()
    		{  
    			Console.WriteLine("disk shutdown!");  
    		}  
    	}
    
    	///////外观角色//////////
    	public class Computer {  
    		private CPU cpu;  
    		private Memory memory;  
    		private Disk disk;  
    
    		public Computer(){  
    			cpu = new CPU();  
    			memory = new Memory();  
    			disk = new Disk();  
    		}  
    
    		public void startup(){  
    			Console.WriteLine("start the computer!");  
    			cpu.startup();  
    			memory.startup();  
    			disk.startup();  
    			Console.WriteLine("start computer finished!");  
    		}  
    
    		public void shutdown(){  
    			Console.WriteLine("begin to close the computer!");  
    			cpu.shutdown();  
    			memory.shutdown();  
    			disk.shutdown();  
    			Console.WriteLine("computer closed!");  
    		}  
    	}
    }
    

    优缺点

    优点:
          外观模式对客户屏蔽了子系统组件,从而简化了接口,减少了客户处理的对象数目并使子系统的使用更加简单。
          外观模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件是紧耦合的。松耦合使得子系统的组件变化不会影响到它的客户。
    缺点:
          如果增加新的子系统可能需要修改外观类或客户端的源代码,这样就违背了”开——闭原则“(不过这点也是不可避免)。

    使用场景

    1.为一个复杂的子系统提供一个简单的接口
    2.提供子系统的独立性
    3.在层次化结构中,可以使用外观模式定义系统中每一层的入口。其中三层架构就是这样的一个例子。

    总结

          到这里外观模式的介绍就结束了,外观模式,为子系统的一组接口提供一个统一的接口,该模式定义了一个高层接口,这一个高层接口使的子系统更加容易使用。并且外观模式可以解决层结构分离、降低系统耦合度和为新旧系统交互提供接口功能。

  • 相关阅读:
    Linux cooked-mode capture 格式转换
    lo口环路问题分析
    感知器与多层感知机
    梯度下降
    Unity UGUI Canvas 使用Slider制作角色血条
    NGUI 通过按压Button控制角色持续行走
    python基础--函数(二)
    python基础--函数(一)
    python基础--推导式
    python基础--公共操作
  • 原文地址:https://www.cnblogs.com/shirln/p/10245259.html
Copyright © 2011-2022 走看看