外观模式

本文深入探讨了外观模式(Facade Pattern),一种简化系统接口并提高子系统使用便捷性的设计模式。通过引入外观角色,降低了客户类与子系统之间的耦合度,使系统更易于维护和扩展。文章详细介绍了外观模式的结构、实现方式及其优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.概述

外观模式(Facade Pattern):为子系统中的一组接口提供一个系统的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加易于使用。

在外观模式中,一个子系统的外部与其内部的通信通过一个统一的外观类进行,外观类将客户类与子系统的内部复杂性分隔开,使得客户类只需与外观角色打交道,而不需要与子系统内部的很多对象打交道。

外观模式又称为门面模式,它是一种对象结构型模式。外观模式是迪米特法则的一种具体实现,通过引入一个新的外观角色来降低原有系统的复杂度,同时降低客户类与子系统的耦合度。

2.结构

(1)Facade(外观角色):在客户类可以调用它的方法,在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,它将所有从客户类发来的请求委派到相应的子系统,传递给相应的子系统对象处理。

(2)SubSystem(子系统角色):在软件系统中可以有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;每一个子系统都可以被客户类直接调用,或者被外观类调用,它处理由外观类传过来的请求;子系统并不知道外观的存在,对于子系统而言,外观角色仅仅是另一个客户类而已。

3.实现

namespace Facade
{
    public class SubSystemA
    {
        public void MethodA()
        {
            //--
        }
    }
    public class SubSystemB
    {
        public void MethodB()
        {
            //--
        }
    }
    public class SubSystemC
    {
        public void MethodC()
        {
            //--
        }
    }
    public class Facade
    {
        private SubSystemA subSystemA = new SubSystemA();
        private SubSystemB subSystemB = new SubSystemB();
        private SubSystemC subSystemC = new SubSystemC();
        public void Method()
        {
            subSystemA.MethodA();
            subSystemB.MethodB();
            subSystemC.MethodC();
        }
    }
    public class Client
    {
        public void UseMethod()
        {
            Facade facade = new Facade();
            facade.Method();
        }
    }
    //--抽象外观类
    public abstract class AbstractFacade
    {
        protected SubSystemA subSystemA = new SubSystemA();
        protected SubSystemB subSystemB = new SubSystemB();
        protected SubSystemC subSystemC = new SubSystemC();
        public abstract void AbstractMethod();
    }
    public class ConcreteFacadeA : AbstractFacade
    {
        public override void AbstractMethod()
        {
            subSystemA.MethodA();
            subSystemB.MethodB();
        }
    }
    public class ConcreteFacadeB : AbstractFacade
    {
        public override void AbstractMethod()
        {
            subSystemC.MethodC();
            subSystemA.MethodA();
        }
    }
}

4.优缺点

(1)它对客户类屏蔽了子系统组件,减少了客户类所需处理的对象数目,并使得子系统使用起来更加容易。通过引入外观模式,客户类代码将变得很简单,并与之关联的对象也很少。

(2)它实现了子系统与客户类之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户类,只需要调整外观类即可。

(3)一个子系统的修改对其他子系统没有任何影响,而且子系统的内部变化也不会影响到外观对象。

(1)外观类不能很好的限制客户类直接使用子系统类,如果对客户类访问子系统类做太多限制则减少了可变形和灵活性。

(2)如果涉及不当,增加新的子系统可能需要修改外观类的源码,违背开闭原则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值