设计模式(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.在层次化结构中,可以使用外观模式定义系统中每一层的入口。其中三层架构就是这样的一个例子。
总结
到这里外观模式的介绍就结束了,外观模式,为子系统的一组接口提供一个统一的接口,该模式定义了一个高层接口,这一个高层接口使的子系统更加容易使用。并且外观模式可以解决层结构分离、降低系统耦合度和为新旧系统交互提供接口功能。
设计模式(C#)——09外观模式的更多相关文章
- Java设计模式之《外观模式》及应用场景
		
原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6484128.html 1.外观模式简介 外观模式,一般用在子系统与访问之间,用于对访问屏蔽复 ...
 - PHP设计模式之:外观模式
		
外观模式: 外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用: 外观模式又称为门面模 ...
 - C#设计模式之十一外观模式(Facade)【结构型】
		
一.引言 快12点半了,要开始今天的写作了.很快,转眼设计模式已经写了十个了,今天我们要讲[结构型]设计模式的第五个模式,该模式是[外观模式],英文名称是:Facade Pattern.我们先从名字上 ...
 - 设计模式学习心得<外观模式 Facade>
		
外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这种模式涉及 ...
 - C#设计模式之十外观模式(Facade Pattern)【结构型】
		
一.引言 快12点半了,要开始今天的写作了.很快,转眼设计模式已经写了十个了,今天我们要讲[结构型]设计模式的第五个模式,该模式是[外观模式],英文名称是:Facade Pattern.我们先从名字上 ...
 - 设计模式のFacadePattern(外观模式)----结构模式
		
一.产生背景 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. ...
 - Java设计模式学习记录-外观模式
		
前言 这次要介绍的是外观模式(也称为门面模式),外观模式也属于结构型模式,其实外观模式还是非常好理解的,简单的来讲就是将多个复杂的业务封装成一个方法,在调用此方法时可以不必关系具体执行了哪些业务,而只 ...
 - java设计模式-----12、外观模式
		
Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种.Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面.这个一致的简单的界面被称作facade. ...
 - c#设计模式之:外观模式(Facade)
		
一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ...
 
随机推荐
- 深入理解Java中的锁(一)
			
Java中锁的概念 自旋锁 : 是指当一个线程在获取锁的时候,如果锁已经被其他线程获取,那么该线程将循环等待,然后不断判断锁是否能够被成功获取,直到获取到锁才会退出循环. 乐观锁 : 假定没有冲突,在 ...
 - Java emoji持久化mysql
			
好久没有更新博客了,今天和大家分享一个关于emoji表情持久化问题,相信做web开发的都遇到过这样的问题,因为我们知道mysql的utf-8字符集保存不了保存不了表情字符,这是为什么呢?因为普通的字符 ...
 - 2019牛客暑期多校训练营(第四场)K.number
			
>传送门< 题意:给你一个字符串s,求出其中能整除300的子串个数(子串要求是连续的,允许前面有0) 思路: >动态规划 记f[i][j]为右端点满足mod 300 = j的子串个数 ...
 - Servlet的介绍
			
Servlet由来 做过BS项目的人都知道,浏览器能够根据HTML静态标记语言来显示各式各样的网页.但是如果我们需要在网页上完成一些业务逻辑:比如登陆验证.或者说网页显示的内容在服务器的数据库中.如果 ...
 - centos7更新yum库为aliyun库
			
1. 备份原来的yum源$sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2.设置ali ...
 - 关于STM32F103+ESP8266+阿里云过程之修改SDK连接至阿里云(二)
			
继上篇的阿里云物联云平台设置之后,接下来的工作就是对安信可官方给的sdk进行修改 安信可ESP系列集成环境,SDK,aliyun_mqtt_app,下载地址在上一篇博客,https://www.cnb ...
 - 最火的分布式 HTAP 数据库 TiDB - 入门实践教程
			
偶然在某篇博客看到了 TiDB,一个融合 OLTP 和 OLAP 的分布式开源数据库, GitHub 上 Star 很多,然后 watch 了,发现 commit 和 pull request 一直都 ...
 - Core CLR 自定义的Host官方推荐的一种形式(第一种)
			
.Net Core CLR提供两种Host API访问 托管代码的形式,按照微软官方的说法,一种是通过CoreClr.DLL来直接调用托管生成的DLL程序集,另外一种是通过CoreClr里面的C导出函 ...
 - Linux系统下减少LV(逻辑卷)容量
			
查看文件系统现有 lv_test 容量,总计9.9G,已使用2% 命令 df -h 2 查看系统中的 PV 情况 命令:pvdisplay vg_test 下有两个 PV,分别为 /dev/sdb1 ...
 - Linux及Windows下ActiveMQ下载与安装教程
			
原文连接:(http://www.studyshare.cn/blog-front//blog/details/1170/0 )一.下载 Windows: 1.官网下载地址:这里 2.百度网盘下载:这 ...