目前刚开始学习,感觉博大精深,下面狂妄的话还是别看了
中介者模式:当同事关系过多的时候,他们直接交互会引起混乱,我们使用一个中间人进行交互,他们之间的数据传递我们也封装起来:类图如下,这里面只提供一个例子,供大家学习,至于详细介绍的内容大家可以寻找我的板块:学习设计模式的传送门
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MediatorPattern03_2 :MonoBehaviour{
void Start()
{
MediatorConcrete_2 m = new MediatorConcrete_2();
ComponentButton b = new ComponentButton(m);
ComponentRemoveButton rb = new ComponentRemoveButton(m);
ComponentList l = new ComponentList(m);
ComponentSelect_2 cs = new ComponentSelect_2(m);
//注册对象
m.b = b;
m.rb = rb;
m.l = l;
m.showList = cs;
//开始使用
b.Change();
rb.Change();
cs.Select("杨铁心");
b.Change();
}
}
public interface IMediator_2
{
void CollegeChange(IComponent_2 c);
}
public class MediatorConcrete_2 : IMediator_2
{
//持有四个同事类引用
public ComponentButton b;
public ComponentList l;
public ComponentRemoveButton rb;
public ComponentSelect_2 showList;
public MediatorConcrete_2()
{
}
public void CollegeChange(IComponent_2 c)
{
//如果按钮状态改变了
if (c == b)
{
//添加角色
l.AddRole(showList.CurrentRole);
//更新显示
l.Refresh();
}
if (c == rb)
{
l.RemoveRole(showList.CurrentRole);
l.Refresh();
}
//如果点击了角色栏,则表明当前选择的角色
if (c == showList)
{
showList.Select(showList.CurrentRole);
}
}
}
//抽象同事基类
public abstract class IComponent_2
{
//持有中介者引用
private IMediator_2 me;
public IComponent_2(IMediator_2 me)
{
this.me = me;
}
//依赖的方法
public virtual void Change() { me.CollegeChange(this); }
//其他方法
public virtual void Refresh() { }
}
public class ComponentButton : IComponent_2
{
public ComponentButton(IMediator_2 me) : base(me) { }
public override void Change()
{
Debug.Log("增加一位英雄");
base.Change();
}
}
public class ComponentRemoveButton : IComponent_2
{
public ComponentRemoveButton(IMediator_2 me) : base(me)
{
}
public override void Change()
{
Debug.Log("减少一位英雄");
base.Change();
}
}
public class ComponentList : IComponent_2
{
private string[] m_roleArr = new string[] { "一叶春", "汪臧海" };
private List
m_roleList;
public ComponentList(IMediator_2 me) : base(me)
{
m_roleList = new List
(new string[] { "张无涯", "赵平生", "冰绥新" });
}
//自己的方法
public void AddRole(string name)
{
m_roleList.Add(name);
Debug.Log("已经增加了一位角色");
}
public void RemoveRole(string name)
{
m_roleList.Remove(name);
Debug.Log("移除角色成功");
}
public override void Refresh()
{
Debug.Log("已经刷新List并重新显示");
Debug.Log("当前角色为");
foreach (var item in m_roleList)
{
Debug.Log(item);
}
}
}
public class ComponentSelect_2 : IComponent_2
{
private string currentRole;
public string CurrentRole { get { return currentRole; } }
public ComponentSelect_2(IMediator_2 me) : base(me) { }
public void Select(string name)
{
currentRole = name;
}
public override void Change()
{
Debug.Log("已选择" + currentRole);
base.Change();
}
}