中介者模式

顾名思义,当多个对象需要互相调用对方的时候,我们可以使用一个中介对象来封装这种行为。比如班上的同学要问对方要qq号,如果是两两问对方要,就是这种网状结构。


我们建一个qq群,同学想要别人的qq号只要在群里找就好了,这就是中介者模式。


中介者模式的好处(也可能是坏处):

当我们想要改变各对象交互方式的时候,更改中介类就好了,这样降低了耦合性,使代码结构更清晰,但是一旦中介类更改,对所有用到中介类的对象都会有影响。

Unity举例:

比如我们要实现主角和npc如果距离小于10就掉血。不用中介者模式是这样写的:

public  class  NPC:MonoBehaviour
{

	public  void ReduceBlood()
	{
		
	}
	public  void CaculateBlood(Transform  charactor)
	{
		float tmpDistance = Vector3.Distance (transform.position,charactor.transform.position);

		if (tmpDistance < 10) {

			ReduceBlood ();

		}

	}
}


public  class  Charactor:MonoBehaviour
{


	public  void ReduceBlood()
	{


	}

	public  void  CaculateBlood(Transform NPC)
	{
		float tmpDistance = Vector3.Distance (transform.position,NPC.transform.position);

		if (tmpDistance < 10) {
		
			ReduceBlood ();

		}
	}

}


使用中介者模式:

using UnityEngine;
using System.Collections;
//中介者模式,在角色前方距离5,左右距离3米的范围内角色可以攻击
public class ActorBase:MonoBehaviour{
	public virtual void ReduceBlood(){} 
}

public class Character:ActorBase{
	public override void ReduceBlood(){

	}
}

public class Enemy:ActorBase{
	public override void ReduceBlood(){

	}
}

public class AttackAgent: MonoBehaviour{
	/// <summary>
	/// Caculates the distance.
	/// </summary>
	/// <param name="attacked">Attacked.</param>
	/// <param name="attack">Attack.</param>
	public  void  CaculateDistance(ActorBase  attacked, ActorBase attack)
	{
		float tmpDistance = Vector3.Distance(attacked.transform.position, attack.transform.position);
		
		if (tmpDistance < 10.0f) {
			attacked.ReduceBlood ();
		}	
	}
	/// <summary>
	/// 计算是否在攻击范围内
	/// </summary>
	/// <returns><c>true</c>, if attack was caculated, <c>false</c> otherwise.</returns>
	/// <param name="attack">Attack.攻击者</param>
	/// <param name="attacked">Attacked.被攻击者</param>
	public bool CaculateAttack(GameObject attack, GameObject attacked){
		//攻击者和被攻击者之间的向量,attack.transform.right即(1, 0, 0),attack.transform.forward即(0, 0, 1)
		Vector3 vec = attacked.transform.position - attack.transform.position;
		float  rightDis = Vector3.Dot(vec, attack.transform.right.normalized);//点乘上攻击者右方向向量,也就是求出右边的距离
		float  leftDis = Vector3.Dot(vec, -attack.transform.right.normalized);//左边的距离
		float forwordDis = Vector3.Dot(vec, attack.transform.forward.normalized);//与攻击者前方向量点乘,若小于0说明在其后方
		if (rightDis<=3 && leftDis<=3 && forwordDis>=0 && forwordDis<=5){
			return true;
		}
		return false;
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
P2P终结者是由Net.Soft工作室开发的一套专门用来控制企业网络P2P下载流量的网络管理软件(zol提供P2P终结者下载)。 P2P终结者针对目前P2P软件过多占用带宽的问题,提供了一个非常简单的解决方案。P2P终结者基于底层协议分析处理实现,具有很好的透明性。软件可以适应绝大多数网络环境,包括代理服务器、ADSL路由器共享上网,Lan专线等网络接入环境。它可以让您轻松地、傻瓜化地管理局域网中BT、电驴等大量占用带宽的网络引用,为家庭、企业节省宝贵的有限带宽,从而保障网页浏览,邮件,企业ERP等关键应用。 P2P终结者功能特性: 安装部署简单,在局域网内任意一台主机安装即可管理整个网络 可管理多达十余种P2P下载应用 可管理常见聊天工具,如QQ、MSN 支持自定义管理规则设置,可以针对不同主机设置不同规则 支持自定义管理时间段设置,工作时间、休息时间灵活管理 支持主机流量统计以及查询 支持主机自定义备注功能 P2P终结者更新日志: P2P终结者4.33 [2014-07-26] *修复控制主机断网问题 *优化界面信息显示结构 *修复单台主机日流量过大会清零问题 *完善本机程序网速使用信息 P2P终结者4.22 更新网卡地址库资源 优化网络驱动引擎 降低控制时CPU资源占用 P2P终结者4.20 [2011-05-23] 增强标准模式下软件限速能力 调整驱动API调用,提高处理效率 优化软件代码,降低资源占用

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值