外观模式+游戏开发中的设计模式——外观模式

何为外观模式

外观模式(Facade):为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使子系统更加容易使用

依赖倒转原则+迪米特法则思想

 

 代码实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 外观模式
{
    class Program
    {
        static void Main(string[] args)
        {
            Facade facade=new Facade();
            //由于Facade的作用,客户端可以根本不知子系统类的存在
            facade.MethodOne();
            facade.MethodTwo();

            Console.ReadKey();
        }
    }
    //外观类
    class Facade 
    {
        //外观类,他需要了解所有的子系统的方法或属性,进行组合,以备往外界调用
        A a;
        B b;
        C c;
        D d;
        public Facade()
        {
            a=new A();
            b=new B();
            c=new C();
            d=new D();
        }
        public void MethodOne() {
            a.MethodA();
            d.MethodD();
        }
        public void MethodTwo() {
            b.MethodB();
            c.MethodC();
            d.MethodD();
        }
    }
    //子系统类
    class A {
        public void MethodA() {
            Console.WriteLine("A类");
        }
    }
    class B
    {
        public void MethodB()
        {
            Console.WriteLine("B类");
        }
    }
    class C
    {
        public void MethodC()
        {
            Console.WriteLine("C类");
        }
    }
    class D
    {
        public void MethodD()
        {
            Console.WriteLine("D类");
        }
    }
}

 

应用场合 

分三个阶段

首先,在设计初期阶段,应该有意识的将不同的两个层分离,层与层之间建立外观Facade,可以为复杂的子系统提供一个简单的接口,使耦合大大降低

其次,在开发阶段,子系统往往因为不断的重构演化而变得原来越复杂,,,大多数的模式使用时,也都会产生很多很小的类,也给外部调用带来了困难,,,增加外观模式Facade可以提供一个简单的接口,减少他们之间的依赖

第三,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展,,为新系统开发一个外观Facade类,来提供设计粗糙或高复杂的遗留代码的比较清晰的简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。

 

 案例:

创建Facade类

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class GameFacade  {

    //创建游戏子系统管理的总类Facade(外观模式)


    //辅助状态管理,添加游戏是否结束,判断何时切换场景
    private bool mIsGameOver = false;


    public bool isGameOver {
        get { return mIsGameOver; }
    }

	public void Init () //即MethodOne
    {
        //具体的A\B\C\D等子类
	
	}


    public void Update()//即MethodTwo
    {
        //具体的A\B\C\D等子类
	}

    public void Release() //即MethodThree
    {
        //具体的A\B\C\D等子类
    }
}

使用Facade类 

using System;
using System.Collections.Generic;
using System.Text;

public  class AttackState:ISceneState
{
    public AttackState(SceneStateControl controller): base("03AttackScene", controller)
    { 
        
    }

    
    private GameFacade mFacade;
    //创建一个类,管理
    //兵营、关卡、角色管理、行动力、成就等子系统系统
    //由于Facade类的作用,AttackState可以不用知道具体子类的存在
    //使用Facade外观模式,使AttackState很简洁,只处理与自身状态有关的


    public override void StateStart()
    {
        mFacade.Init();//使用FacademethodOne
    }

    public override void StateEnd()
    {
        mFacade.Release();//使用FacademethodTwo
    }

    public override void StateUpdate()
    {
        if(mFacade.isGameOver){
            mControler.SetState(new MainState(mControler));
        }
        mFacade.Update();//使用FacademethodThree
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值