Unity_设计模式_外观模式_06

来源:互联网 发布:淘宝上买枪会判刑么 编辑:程序博客网 时间:2024/05/22 00:24

外观模式(Facade),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。
这里写图片描述
一个客户类需要和多个业务类交互,而这些需要交互的业务类经常会作为一个整体出现。
引入一个新的外观类(Facade)来负责和多个业务类【子系统(Subsystem)】进行交互,而客户类只需与外观类交互。
为多个业务类的调用提供了一个统一的入口,简化了类与类之间的交互。
没有外观类:每个客户类需要和多个子系统之间进行复杂的交互,系统的耦合度将很大。
引入外观类:客户类只需要直接与外观类交互,客户类与子系统之间原有的复杂引用关系由外观类来实现,从而降低了系统的耦合度。
定义
这里写图片描述
一个子系统的外部与其内部的通信通过一个统一的外观类进行,外观类将客户类与子系统的内部复杂性分隔开,使得客户类只需要与外观角色打交道,而不需要与子系统内部的很多对象打交道。
外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。对象结构型模式。
又称为门面模式,是迪米特法则的一种具体实现。
通过引入一个新的外观角色来降低原有系统的复杂度,同时降低客户类与子系统的耦合度。
所指的子系统是一个广义的概念,它可以是一个类、一个功能模块、系统的一个组成部分或者一个完整的系统。
结构
这里写图片描述
外观模式包含以下2个角色:
Facade(外观角色)
SubSystem(子系统角色)
实例说明
游戏中技能组合的使用:
LOL瑞文的光速QA,可以设置为一键触发,然后就不需要繁琐的操作,出错的概率更低,在不设置之前,我们该怎么实现光速QA?
Q一下,A一下,Q一下,A一下,Q一下,A一下,你需要进行6次操作,当我们设置好之后,我们就可以按下我们之前设置的一个键位,直接触发这个操作,自动帮我们完成。
我们怎么实现这个效果?(这中技能组合我们在过程中,是可以打断的)。
然而,你也可以组合一个,大招CD和Q的CD好的时候的一套技能组合。
最懒玩家甚至可以设置,全部技能CD好的情况下的,技能连招,甚至加上点燃。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FacadeModel
{

class Program{    static void Main(string[] args)    {        SkillManager skillManager = new SkillManager();        skillManager.SkillGroup1();    }}//平A攻击class Attack{    public void Foo()    {        Console.WriteLine("平A了一次");    }}//Q技能class Skill_Q{    public void Foo()    {        Console.WriteLine("释放一段符文之刃技能");    }}class Skill_W{    public void Foo()    {        Console.WriteLine("释放技能--震魂怒吼");    }}class Skill_E{    public void Fo()    {        Console.WriteLine("释放技能--勇往直前");    }}class Skill_R{    public void Foo()    {        Console.WriteLine("释放技能--放逐之锋");    }}//召唤师技能class SummonerSkill{    public void Light()    {        Console.WriteLine("释放召唤师技能--点燃");    }    public void Blink()    {        Console.WriteLine("释放召唤师技能--闪现");    }}class SkillManager{    Attack attack = new Attack();    Skill_Q skill_q = new Skill_Q();    Skill_W skill_w = new Skill_W();    Skill_E skill_e = new Skill_E();    Skill_R skill_r = new Skill_R();    SummonerSkill summonerSkill = new SummonerSkill();    //光速QA    public void SkillGroup1()    {        skill_q.Foo();        attack.Foo();        skill_q.Foo();        attack.Foo();        skill_q.Foo();        attack.Foo();    }}

}
模式优点
它对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。
它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可。
一个子系统的修改对其他子系统没有任何影响,而且子系统的内部变化也不会影响到外观对象。
模式缺点
不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活性。
如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则。
模式使用环境
要为访问一系列复杂的子系统提供一个简单入口。
客户端程序与多个子系统之间存在很大的依赖性。
在层次化结构中,可以使用外观模式的定义系统中每一层的入口,层与层之间不直接产生联系,而是通过外观类建立联系,降低层之间的耦合度。

原创粉丝点击