`
guafei
  • 浏览: 323246 次
  • 性别: 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();
}
}
分享到:
评论

相关推荐

    终结者文件加密大师

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

    p2p终结者4.34

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

    P2P终结者增强 版

    P2P终结者增强版 适用于局域网中的限速别人电脑的网速、、 不过要厚道些 适用于局域网 无线局域网

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

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

    终结者文件夹加密大师

    程序体积小巧,加密速度快,支持U盘/移动硬盘上面的文件夹加密,方便安全,终结者文件夹加密大师有简单/高级/Vista(Server2008)三种加密模式,下面分别做一下介绍: (a):简单加密模式:打开软件时默认使用简单模式...

    windows系统优化终结者2007Beta版

    Windows系统服务优化终结者 2007 beta 3.3.0 采用NT核心的Windows操作系统默认开启了许多系统服务,有些系统服务并不是必需的,但它却占用了相当一部分内存资源,对于内存资源紧张的用户来说这是不可容忍的。并且有...

    批量更名终结者接近Windows资源管理器操作

    批量更名终结者可能给文件批量改名。 一款可以对磁盘文件和文件夹进行多功能批量更名操作的实用工具。 接近Windows资源管理器操作和显示风格(侧重图标和命令),便捷的执行方式,强大的更名功能(当前版本有“递增...

    P2P终结者V4.21最高权限版

    P2P终结者是一款网络管理软件,用来管理局域网中BT、电驴等大量占用带宽的下载软件,可以帮助您更好的管理您的局域网。它可以运行在Windows2000/XP/2003操作系统上。 P2P终结者 v4.21 官方正式版更新内容: *设置...

    批量更名终结者2022一款可以对磁盘文件和文件夹进行多功能批量更名操作的实用工具.rar

    批量更名终结者20.22单文件版批量更名终结者是一款可以对磁盘文件和文件夹进行多功能批量更名操作的实用工具。 拥有简化的资源管理器功能,强大的全盘搜索功能,高级的多模式过滤功能,列表整理打印功能......... ...

    p2p终结者4.20破解版最高权限.rar

    p2p终结者4.20最高权限破解版更新日期2011.05.23,此版本优化了软件代码,降低了资源占用率。增强标准模式下软件限速能力,调整驱动API调用,提高处理效率。可自定义设置控制规则,可以控制P2P下载,限制带宽最大...

    批量更名终结者

    最强:多项原创的更名规则,特别筛选优化的更名方式,尽可能贴近用户使用习惯的更名模式... 最炫:提供当前最流行的超炫皮肤,如QQ系列(包括QQ影音),Office系列,苹果系列等等几十套皮肤,还可随意调整皮肤的颜色...

    文件删除终结者--XDELBOX

    在普通模式下无法找到的文件,XDELBOX开放不检查文件是否存在的导入删除 1、对付最近的candoall.exe 类病毒,这个病毒的C:\WINDOWS\system32\hideme.sys功能还行,XDELBOX通过剪贴板导入上述病毒文件时,均报告文件...

    批量更名终结者 V2.6

    最强:多项原创的更名规则,特别筛选优化的更名方式,尽可能贴近用户使用习惯的更名模式... 最炫:提供当前最流行的超炫皮肤,如QQ系列(包括QQ影音),Office系列,苹果系列等等几十套皮肤,还可随意调整皮肤的颜色...

    病毒专杀工具AV终结者

    监测发现了一系列反击杀毒软件,破坏系统安全模式,植入木马下载器的病毒。并将这一类病毒命名为“AV终结者”,AV终结者指的是一批具备以下破坏性的病毒、木马和蠕虫。

    批量更名终结者 V2.5多文件绿色提速版

    最强:多项原创的更名规则,特别筛选优化的更名方式,尽可能贴近用户使用习惯的更名模式... 最炫:提供当前最流行的超炫皮肤,如QQ系列(包括QQ影音),Office系列,苹果系列等等几十套皮肤,还可随意调整皮肤的颜色...

    批量更名终结者一款文件批量更名的软件.exe

    批量更名终结者,不仅仅是一个拥有众多优秀独立功能板块的批量更名工具,它还拥有简化的资源管理器功能,强大的全盘搜索功能,高级的多模式过滤功能,列表整理打印功能......... 当前版本有“递增”、“替换”、...

    Windows系统服务优化终结者

    假如您有打印机,但平时不常用,所以不愿意一直开着打印服务(print spooler),您可以先把打印服务开启,然后定制为某种模式,定制后,你可以把打印服务关闭,启动类型设为手动或禁用,需要打印时点击此模式,打印服务...

    AV终结者”木马专杀工具

    这样的一个病毒,打开杀毒软件它会立刻帮你关掉,浏览器输入病毒两个字打开它也会立刻将你整个浏览器关掉,进入安全模式进不了,可能会出现蓝屏,这种叫做终结者病毒,下载这个专杀什么都帮你解决了。

    机器狗/磁碟机/AV终结者" 木马专杀工具 v7.41

    清除机器狗/AV终结者/8749病毒,自带“引擎与病毒库”“磁碟机”专杀;修复“映像劫持”;修复Autorun.inf;修复安全模式。使用该专杀工具查杀后,请使用金山毒霸进行一次全面杀毒即可 利用此专杀工具,用户不但可...

    TerminatorExample:使用常见的设计模式创建一支终结者大军

    终结者示例使用常见的设计模式创建一支终结者大军。 这是的源代码。

Global site tag (gtag.js) - Google Analytics