Fork me on GitHub

设计模式(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.在层次化结构中,可以使用外观模式定义系统中每一层的入口。其中三层架构就是这样的一个例子。

总结

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

posted @ 2019-01-09 16:34  爱上游戏开发  阅读(145)  评论(0编辑  收藏  举报
 >>>转载请注明出处