`
guafei
  • 浏览: 328176 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

中介者模式

阅读更多
1 解决问题
一群平级的对象要互相调用(通信),于是系统变得杂乱无章的网状

因此设置一个中心节点,把网状变成星型,由中心节点控制协调。此时中心节点就叫中介者

2 解决方法
一个抽象中介者
一个抽象通信者
一个具体中介者,它里面有各个具体通信者对象,并有一个协调的方法send()供大家调用(例如,供a调用,然后触发b、c的exe()时间、供b调用,触发c、d的exe()事件)
一群具体通信者,它有一个中介者的域,通过中介者来通信,

具体应用:
•  语义:类和类之间不要直接打交道,通过一个中间类来打交道,这个中间类就是调停者,也就是中介 
•   
•  原来的结构是网状的,这样加入一个中介,把他变成星型结构。。这样让中间这个类变得复杂,让旁边的类变得简单。。。。 
•   
•  大家在每个机场都会看到有一个叫做“XX 机场调度中心”,这个是做什么用的呢?就是 
•  具 体的中介者,调度每一架要降落和起飞的飞机,一架分机(同事类)飞到机场上空了,就询问(同事类方法)调度中心(中介者)“我是否可以降落”,“降落到那 个跑道”,然后调度中心(中介者)查看其他飞机(同事类)情况,通知飞机降落,我们来设想一下,如果没有机场调度中心会是什么样子的:飞机到机场了,自己 要先看看有没有飞机和自己一起降落的,有没有空跑道,停机位是否具备等等情况,这不是要了飞行员老命才怪! 
•   
•  MVC 框 架。大家都应该使用过Struts 吧,MVC 框架,其中的C(Controller)就是一个中介者,叫做前端控制器 (Front Controller),它的作用就是把M(Model,业务逻辑)和V(View,视图)隔离开,协调M和V 协同工作,把M 运行的结 果和V 代表的视图融合成一个前端可以展示的页面,减少M 和V 的依赖关系。MVC 框架已经成为一个非常流行、成熟的开发框架,这也是中介者模式优秀 的一个体现。 
•   
•   
•  C/S 结 构。C/S 结构的应用也是一个典型的中介者模式,比如MSN,张三发一个消息给李四,其过程应该是这样的:张三发送消息,MSN 服务器(中介者)接受 到消息,查找李四,把消息发送到李四,同时通知张三,消息已经发送,在这里MSN 服务器就是一个中转站,负责协调两个客户端的信息交流,与此相反的就是 IPMSG(也叫飞鸽)没有使用中介者,直接使用了UDP 广播的方式,每个客户端既是客户端也是服务端。 
•   
•  大家可以在如下的情况下尝试使用中介者模式: 
•  1、N 个对象之间产生了相互的依赖关系,其中N 大于2,注意是相互的依赖; 
•   
•  2、多个对象有依赖关系,但是依赖的行为尚不确定或者有发生改变的可能,在这种情况下一般建议采用中介者模式,降低变更引起的风险扩散; 
•   
•  3、产品开发。其中一个明显的例子就是MVC 框架,把这个应用到产品中,可以提升产品的性能和扩展性,但是作为项目开发就未必,项目是以交付投产为目标,而产品以稳定、高效、扩展为宗旨。 
•   
•  每一个协作的类都拥有一个中介者的引用,而中介者却拥有协作类的方法。。。。。 
抽象中介者(Mediator):定义出同事对象到中介者对象的接口。
具体中介者(ConcreteMediator):通知所有的具体同事类,它从具体同事对象接收消息,又向具体通知对象发出消息。
抽象同事类(Colleague):定义出中介者到同事对象的接口,同事对象只知道中介者,而不知道其他的对象。
具体同事对象(ConcreteColleague):每一个具体同事类都很清楚它自己在小范围内的行为,而不知道它在大范围内的目的。
public class Mediator{
public abstract void sendto(Collage c,String message);
}

public class ConcreateMediator extends Mediator{
private ConcreateCollage1 c1;
private ConcreateCollage1 c2;
private ConcreateCollage1 c3;

//c1 c2 c3 的setter略

public void sendto(Collage c,String message){
if(c==c1){
c2.dosomething();
}eise if(c==c2){
c2.dosomething();
}
}
}

public class Collage{
protected Mediator m;
public Collage(Mediator m){
this.m = m;
}
}

public class ConcreateCollage1 extends Collage{
public void dosomething(String message){
System.out.println("111" + message);
}
public void send(String message){
mediator.sendto(this,message);
}
}

public class ConcreateCollage2 extends Collage{
public void dosomething(String message){
System.out.println("222" + message);
}
public void send(String message){
mediator.sendto(this,message);
}
}

public class ConcreateCollage3 extends Collage{
public void dosomething(String message){
System.out.println("333" + message);
}
public void send(String message){
mediator.sendto(this,message);
}
}


例子2:
package pattern.mediator;

public abstract class AbstractMediator {
protected Purchase purchase;
protected Sale sale;
protected Stock stock;

// 构造函数
public AbstractMediator() {
purchase = new Purchase(this);
sale = new Sale(this);
stock = new Stock(this);
}
public abstract void execute(String str,Object...objects);
}


package pattern.mediator;

public class Mediator extends AbstractMediator {

@Override
public void execute(String str, Object... objects) {
if (str.equals("purchase.buy")) { // 采购电脑
this.buyComputer((Integer) objects[0]);
} else if (str.equals("sale.sell")) { // 销售电脑
this.sellComputer((Integer) objects[0]);
} else if (str.equals("sale.offsell")) { // 折价销售
this.offSell();
} else if (str.equals("stock.clear")) { // 清仓处理
this.clearStock();
}
}

private void buyComputer(int number) {
int saleStatus = super.sale.getSaleStatus();
if (saleStatus > 80) { // 销售情况良好
System.out.println("采购IBM电脑:" + number + "台");
super.stock.increase(number);
} else { // 销售情况不好
int buyNumber = number / 2; // 折半采购
System.out.println("采购IBM电脑:" + buyNumber + "台");
}
}

private void sellComputer(int number) {
if (super.stock.getStockNumber() < number) { // 库存数量不够销售
super.purchase.buyIBMcomputer(number);
}
super.stock.decrease(number);
}

private void offSell() {
System.out.println("折价销售IBM电脑" + stock.getStockNumber() + "台");
}

private void clearStock() {
// 要求清仓销售
super.sale.offSale();
// 要求采购人员不要采购
super.purchase.refuseBuyIBM();
}
}


package pattern.mediator;

public abstract class AbstractColleague {
protected AbstractMediator mediator;

public AbstractColleague(AbstractMediator mediator) {
this.mediator = mediator;

}
}

package pattern.mediator;

public class Purchase extends AbstractColleague {

public Purchase(AbstractMediator meditor) {
super(meditor);
// TODO Auto-generated constructor stub
}

public void buyIBMcomputer(int number) {
super.mediator.execute("purchase.buy", number);
}

// 不在采购IBM电脑
public void refuseBuyIBM() {
System.out.println("不再采购IBM电脑");
}
}

package pattern.mediator;

import java.util.Random;

public class Sale extends AbstractColleague {

public Sale(AbstractMediator mediator) {
super(mediator);
// TODO Auto-generated constructor stub
}

public void sellIBMComputer(int number) {
super.mediator.execute("sale.sell", number);
System.out.println("销售IBM电脑" + number + "台");
}

public int getSaleStatus() {
Random rand = new Random();
int saleStatus = rand.nextInt(100);
System.out.println("IBM电脑的销售情况为:" + saleStatus);
return saleStatus;
}

// 折价处理
public void offSale() {
super.mediator.execute("sale.offsell");
}
}

package pattern.mediator;

public class Stock extends AbstractColleague {

public Stock(AbstractMediator mediator) {
super(mediator);
// TODO Auto-generated constructor stub
}

private static int COMPUTER_NUMBER = 100;

// 库存增加
public void increase(int number) {
COMPUTER_NUMBER = COMPUTER_NUMBER + number;
System.out.println("库存数量为:" + COMPUTER_NUMBER);
}

// 库存降低
public void decrease(int number) {
COMPUTER_NUMBER = COMPUTER_NUMBER - number;
System.out.println("库存数量为:" + COMPUTER_NUMBER);
}

// 获得库存数量
public int getStockNumber() {
return COMPUTER_NUMBER;
}

// 存货压力大了,就要通知采购人员不要采购,销售人员要尽快销售
public void clearStock() {
System.out.println("清理存货数量为:" + COMPUTER_NUMBER);
super.mediator.execute("stock.clear");
}
}

package pattern.mediator;

public class Test {
public static void main(String[] args) {
AbstractMediator mediator = new Mediator();
// 采购人员采购电脑
System.out.println("------采购人员采购电脑--------");
Purchase purchase = new Purchase(mediator);
purchase.buyIBMcomputer(100);
// 销售人员销售电脑
System.out.println("\n------销售人员销售电脑--------");
Sale sale = new Sale(mediator);
sale.sellIBMComputer(1);
// 库房管理人员管理库存
System.out.println("\n------库房管理人员清库处理--------");
Stock stock = new Stock(mediator);
stock.clearStock();
}
}
分享到:
评论

相关推荐

    终结者2.2本地生成版+终结者完整金牌验证-源码

    【终结者2.2本地生成版】是一款针对软件授权验证技术的工具,它允许开发者在本地环境下生成软件的授权信息,以实现对软件使用的有效控制。这个版本的终结者主要聚焦于提供一种安全且便捷的方式来验证软件的合法性,...

    P2P终结者增强 版

    【P2P终结者增强版】是一款专门针对局域网环境设计的网络管理软件,它允许用户限制局域网内其他计算机的网速。这款工具主要用于优化网络资源分配,防止某些设备过度占用带宽,从而影响整个网络的性能。然而,值得...

    P2P终结者4.07

    4. **隐藏模式**:为了防止被控制的设备发现并禁用,P2P终结者还提供了隐藏运行模式,使得软件能在后台安静地工作。 5. **安装与配置**:WinPcap_4_0_2.exe是Windows Packet Capture库,它是P2P终结者等网络监控...

    终结者文件加密大师

    程序采用100%纯汇编语言编写,实现了文件夹加/解密功能,程序体积小巧,加密速度快,支持U盘/移动硬盘上面的文件夹加密,方便安全,终结者文件夹加密大师有简单/高级两种加密模式。 终结者文件夹加密大师软件的功能...

    p2p终结者4.34

    P2P终结者是由Net.Soft工作室开发的一套专门用来控制企业网络P2P下载流量的网络管理软件(zol提供P2P终结者下载)。 P2P终结者针对目前P2P软件过多占用带宽的问题,提供了一个非常简单的解决方案。P2P终结者基于底层...

    反p2p终结者杀死局域网中的p2p终结者

    标题“反p2p终结者杀死局域网中的p2p终结者”指的是一个特定的软件或技术解决方案,用于在局域网环境中对抗P2P(peer-to-peer)终结者软件。P2P终结者是一种网络管理工具,它通常被用来限制或阻止局域网内的P2P文件...

    广告终结者3.2.12.zip

    值得一提的是,虽然广告终结者3.2.12.zip是针对360极速浏览器特别设计的,但是其标签却是“chrome”,这表明该插件可能也兼容Chrome浏览器,或者开发者正在计划推出适用于Chrome版本的广告终结者。不过,对于大多数...

    局域网终结者1.0

    在局域网终结者中,WinPcap可能被用来抓取和分析网络流量,以便找出可以利用的网络行为模式或IP地址信息。 **局域网终结者.exe** 这个可执行文件是局域网终结者的主要程序。它通过发送特定的数据包或者模拟IP冲突来...

    P2P终结者安装包

    4. **隐藏模式**:为了防止被控制的设备检测到并反制,P2P终结者还提供了隐藏模式,使得软件的运行更加隐蔽。 5. **远程管理**:对于大型网络环境,管理员可以通过远程控制功能管理不同位置的设备,实现全局的网络...

    p2p网络终结者4.7

    《P2P网络终结者4.7:局域网带宽管理利器》 P2P网络终结者4.7是一款专为局域网环境设计的带宽管理工具,它的主要功能在于帮助网络管理员或者普通用户有效地控制局域网内各台计算机对网络资源的占用,确保网络的公平...

    p2p终结者无线网卡专用版p2p终结者无线网卡专用版

    标题中的“p2p终结者无线网卡专用版”是一个软件的特定版本,这通常意味着该软件是为无线网络环境优化的,特别是针对无线网卡的使用。P2P(peer-to-peer)终结者是一种网络管理工具,它主要用于限制局域网内其他设备...

    p2p终结者2.07免安装版

    《P2P终结者2.07免安装版:网络流量管理利器》 P2P终结者2.07免安装版是一款专为用户设计的网络流量管理工具,尤其适用于那些面临网络带宽被过度占用问题的用户。该版本无需进行繁琐的安装过程,用户可以直接运行,...

    封包终结者V1.2.21

    《封包终结者V1.2.21:网络数据包的掌控者》 在信息技术领域,网络数据包的分析和处理是至关重要的一个环节,尤其是对于网络安全、软件开发以及网络调试人员而言。"封包终结者V1.2.21"就是这样一款强大的工具,它...

    终结者文件夹加密大师,好用方便

    程序永久免费,使用100%汇编语言编写,实现了文件夹加/解密的功能,程序体积小巧,加密速度快,支持U盘/移动硬盘上面的文件夹加密,方便安全,终结者文件夹加密大师有简单/高级/Vista(Server2008)三种加密模式,下面...

    五子棋终结者2.0 五子棋终结者是一个计算机执黑必胜的五子棋小程序,严格地、完全地毯式地终结了自由规则下的五子棋!

    《五子棋终结者2.0:执黑必胜的智能策略分析》 五子棋,作为一项源远流长的智力游戏,深受全世界人民的喜爱。它不仅能够锻炼人的逻辑思维能力,还能够让人们在对弈中体会到策略的精妙与竞争的快感。尽管五子棋规则...

    P2P后台终结者源码

    《P2P后台终结者源码解析》 P2P后台终结者,作为一个技术话题,主要涉及的是网络通信和系统管理领域。P2P(Peer-to-Peer)是一种分布式网络架构,它允许网络中的每个节点既是客户端也是服务器,能够直接进行数据...

    反p2p终结者 反p2p终结者

    标题中的“反p2p终结者”显然指的是一款针对P2P(peer-to-peer)网络的防护软件或工具,其主要目标是防止P2P软件对网络资源的过度占用或者阻止恶意P2P活动。P2P网络是一种分布式网络架构,用户之间可以直接交换数据...

    P2P终结者,只需解压即可

    【P2P终结者】是一种网络管理工具,主要用于局域网环境中的网速控制。它以其简单易用的特点,只需解压即可运行,为用户提供了一种便捷的方式来限制局域网内的P2P流量,以保障网络的稳定和高效运行。 在现代的网络...

    录屏终结者,录屏实用软件,无广告绿色功能齐全

    在这样的背景下,录屏终结者这款软件应运而生,以其独特的无广告、绿色安装、功能全面等特性,成为了众多用户的首选。 首先,录屏终结者最为人称道的优势是其无广告的特性。如今,许多软件在使用过程中会插入广告,...

    P2P终结者-家庭版.rar. 下载额。

    P2P终结者不仅可以帮助用户监控家庭网络中的数据流量,还能对P2P活动进行限制,从而确保网络资源被合理地分配给所有设备。 首先,让我们了解一下P2P技术。P2P是一种点对点的网络通信模式,用户既是信息的接收者,也...

Global site tag (gtag.js) - Google Analytics