/horrible-mvc-Project

this is mvc common project,it is simple mvc example,include difference implementations that “view” and “control”

Primary LanguageC#MIT LicenseMIT

框架大纲

1.框架设计目的

该框架最初是制作Mmo所做,后来又应用到个人Horrible game(恐怖fps游戏所作)项目,以及最近与好有协助开发roguelike game,再此基础不断改进而成。框架适合模块化开发,协同工作,此后也会不断改进提升。

2.框架的内容

* controller(包括继承IC接口的command类,以及管理所有command的controller类)
* model(数据类,主要指代Model和Proxy类)
* view(包括继承Vmediator接口的XXXView类,以及管理所有XXXView的view类)
* appfactory(工厂类,用来初始化mvc,也是mvc的入口)
* ovserver(监听器类,用来传参)

3.使用教程

该框架是一个MVC框架,所以关键在于MVC三个模块之间的互相调用

  • M(数据层)
  • V(视图层)
  • C(控制层)

1.Controller模块调用Model模块 C --> M

使用首先我们需要注册Controller类,需要在Appfactory类中创建新的Controller类

   public AddGoodscommand add;//添加物品的命令

然后我们需要在Appfactoryinit方法中,将命令给实例化,并将其绑定对应的字符常量,对应Cmd类里的字段

   void init()
   {
      add = new AddGoodscommand(); //实例化add方法
      AdjustCommand(Cmd.addItem, add);//绑定字符常量,Cmd.addItem="AddGoodscommand"
   }

再次之后,我们只需要在任意位置调用

   AppFactory.instances.Todo(new Observer(Cmd.addItem, "大宝剑"));//大宝剑是参数,可省略

就可以进入AddGoodscommand类的Todo方法啦。 所以我们就来看看AddGoodscommand类的写法 首先它需要继承IC这个类,并且实现Todo的抽象方法,而我们的Todo方法也就是具体功能类,这里用来写我们需要开发的功能,我们可以这么写

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AddGoodscommand : IC
{
    PackProxy packproxy = PackProxy.instances();//Model对象,指代背包数据


    public void Todo(Observer io)
    {
       if(io.msg=="Cmd.addItem")
       {
          //此处代码为PackProxy增加一个新物品,具体可以参考源代码的内容
       }
    }
}

这样就成功实现Controller调用Model了


Controller模块调用Coponent对象 C --> V

1.此处有二种方法,一个是在上面写的Controller的Todo方法中直接调用具体组件对象的实例

    public void Todo(Observer o)
    {
       packageComponent.instante.showPackage((List<Packagemodel> model)o.body)
    }

但是这样处理解耦合不够彻底,新入门的开发者可以这样学习和使用。但最好的办法是在Todo方法里调用View模块,来实现mvvm

    public void Todo(Observer o)
    {
        AppFactory.instances.ViewTodo(new Observer(Cmd.show,(List<Packagemodel> model)o.body));
	//具体为什么这么写可以调用view模块,请接着把下面的内容看完
    }

2.view模块写法

View模块是一个类似于command对象的实现,首先还是需要在Appfactory对象的init方法进行View绑定

    void init()
    {
       AdjustView(new Packageview());
      
    }

这样就绑定好了。接下来我们来看Packageview的实现,首先我们需要重写Vmediator 的抽象字段和方法,我们要在name的返回值给出View的名字,并在msglist中添加可以使用的命令字符

    public class Packageview : Vmediator {
	// Use this for initialization
	public Packageview()
	{
           pack=packageComponent.instante;
	}

	public override string name {
	   get {
	      return "Packageview";
	   }
	}
    
	public override List<string> msglist {
	   get {
	      List<string> mlist = new List<string> ();
	      mlist.Add ("show");//这里也可以用Cmd.show来替代
	      return mlist;
           }
	}


     }

最后当然不要忘了我们的todo方法

	packageComponent pack;
        public override void Todo (Observer o)
	{
	   if(o.msg=="show"){	
   	      pack.show((List<Packagemodel> model)o.body)
	   }
	}

这样做之后,就能通过 AppFactory.instances.ViewTodo进行调用

Model对象

Model对象只是一个单例的数据对象,可以由自己完全编写,当然也可以使用该框架提供的Proxy类和Model类进行便捷处理,这方面的内容待续..

Mvvm升级内容介绍(新)

实际上是 M --> V的方法

使用教程

本次升级为model直接调用view提供桥梁,在每次修改具体model实例时都会刷新view(界面),使部分功能开发更为高效..

新升级内容完全兼容之前的内容,之前代码无需修改,仅在适宜自己功能需要时使用。

使用方法,在Model模块的单例模式的return instance前调用instance.ModelToDoView();这样每次获取model对象进行操作时候都会对View进行刷新

    public static AllTaskproxy instances()
    {
        if (instance == null)
        {
            instance = new AllTaskproxy();

        }
        instance.ModelToDoView();
        return instance;

    }

另外需要在任意unity对象中绑定指定的view,也就是调用

Proxy.instance.regiestNewComponent(Vmediator);

这样桥梁就成功搭建了,此后每次调用Model对象单例时候都会调用View.refresh方法。

框架修改(仅配合理解框架)

具体框架修改内容如下:

model模块也就是Proxy的基类当中增加了二个方法,用来刷新“View”模块,也就是具体的Vmediator类

增加方法如下:

    public void regiestNewComponent(Vmediator t)
    {
        if (IComponentList == null)
        {
            IComponentList = new List<Vmediator>();
        }
        IComponentList.Add(t);
    }

    public void removeNewComponent(Vmediator t)
    {
        if (IComponentList != null && IComponentList.Count > 0)
        {
            IComponentList.Remove(t);
        }

    }

以及调用单例的方法

    public void ModelToDoView()
    {
        if (IComponentList != null && IComponentList.Count > 0)
        {
            foreach (Vmediator t in IComponentList)
            {

                t.refresh();
            }
        }

    }

数据处理

目前数据文件是excel,但处理走的是json相关的逻辑。需要通过excel2json工具转换成对应cs类和json文件

下载链接和资料:https://neil3d.github.io/coding/excel2json.html

json文件和cs文件导入到具体文件夹后,具体数据处理相关使用ArchiveManager这个类的单例,使用 GetSamplelist<T>()可以获取对应序列化实例对象的链表。直接可以用来使用。

参考1

参考2

//源码参考,其他非示例参考代码请自行理解
    public List<T> GetSamplelist<T>()where T:class {
        var t = ArchiveManager.Instance.Retrieve<T>();
        var content = t.ToJson();
        List<T> list = JsonMapper.ToObject<List<T>>(content);
        return list;
    }
    

Authors

License

This project is licensed under the MIT License - see the LICENSE.md file for details