设计模式学习笔记(十八)—Mediator中介者模式

一、模式定义:

用一个中介者对象来封装一系列的对象交互。中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。

二、结构图


1) 抽象中介者:定义同事(Colleague)对象到中介者(Mediatior)对象的接口,通常是一个事件方法。

2) 具体中介者:具体中介者实现抽象中介者声明的方法。知晓所有的具体同事类,从具体同事接收消息向另外的具体同事类发送命令。

3) 抽象同事类:定义中介者到同事对象的接口,同事对象只知道中介者而不知道其他同事对象。

三、一个例子

import java.util.ArrayList;abstract class AbstractMediator{
public abstract void register(AbstractColleague ac);
public abstract void ColleagueChanged(AbstractColleague ac);
}
abstract class AbstractColleague{
private AbstractMediator med;
public AbstractColleague(AbstractMediator mediator){
 this.med=mediator;
}
public abstract void action();
public void changed(){
 med.ColleagueChanged(this);
}
}
class ConcreteMediator extends AbstractMediator{

private ArrayList<AbstractColleague> colleagueList=new ArrayList<AbstractColleague>();
public void register(AbstractColleague ac) {
 colleagueList.add(ac);
}

public void ColleagueChanged(AbstractColleague ac) {
 for(int i=0;i<colleagueList.size();i++){
 if(colleagueList.get(i)!=ac){
  colleagueList.get(i).action();
 }
 }
}
}

class ConcreteColleagueA extends AbstractColleague{
  public ConcreteColleagueA(AbstractMediator mediator){
  super(mediator);
  mediator.register(this);
  }
public void action() {
 System.out.println("AAAAAAAAAAAAAAA");

}
}
class ConcreteColleagueC extends AbstractColleague{
  public ConcreteColleagueC(AbstractMediator mediator){
  super(mediator);
  mediator.register(this);
  }
public void action() {
 System.out.println("CCCCCCCCCCCCCCC");

}
}
class ConcreteColleagueB extends AbstractColleague{
 public ConcreteColleagueB(AbstractMediator mediator){
   super(mediator);
   mediator.register(this);
   }
 public void action() {
 System.out.println("BBBBBBBBBBBBBBB");

 }
}
class test{
public static void main(String[] args){
AbstractMediator mediator=new ConcreteMediator();
AbstractColleague colleagueA=new ConcreteColleagueA(mediator);
AbstractColleague colleagueB=new ConcreteColleagueB(mediator);
AbstractColleague colleagueC=new ConcreteColleagueC(mediator);
colleagueA.changed();
colleagueB.changed();
colleagueC.changed();
}
}

时间: 2024-08-31 11:30:40

设计模式学习笔记(十八)—Mediator中介者模式的相关文章

kvm虚拟化学习笔记(十八)之ESXi到KVM之v2v迁移

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1304461 KVM虚拟化学习笔记系列文章列表 ---------------------------------------- kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51cto.com/703525/1288795 kvm虚拟化学习笔记(二)之linuxkvm虚拟机安装htt

设计模式学习笔记(十)—Factory Method模式

<设计模式>一书对Factory Method模式是这样描述的: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.FactoryMethod使一个类的实例化延迟到其子类. 我的理解:FatoryMethod模式是一种创建型模式,定义一个用于创建对象的接口的意思是说,我们要定义一个用于创建对象的接口(或者说抽象类,实际上就是个抽象工厂abstractFactory),它的内部有一个创建对象的方法,这个方法的返回值是一个接口(或者抽象类)的类型,这个方法就是FactoryMethod:让子类

设计模式学习笔记(十六)—Proxy模式

一.Proxy模式定义: 为其他对象提供一种代理以控制这个对象的访问. 二.模式解说 Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上.在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层,这个访问层也叫代理.Proxy模式是最常见的模式,在我们生活中处处可见,例如我们买火车票

设计模式学习笔记(十九)—Chain of Responsibility职责链模式

由于本人水平有限,写出来的东西也许对初学者有所帮助.如果不小心哪位大侠看了不要见笑,哪里有不正确的地方还请批评指正.好了不说废话了. Chain of Responsibility模式定义: 为了避免请求的发送者和接收者之间的耦合关系,使多个接受对象都有机会处理请求.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 我的理解: 在不止一个对象可以处理客户端请求的时候,为了使每个对象都有处理请求的机会,把这些对象顺序地串联起来形成一个链,每个被串联的对象都有一个指向下一个对

设计模式学习笔记(十五)—State模式

一.State模式定义: 允许一个对象在其状态改变时,改变它的行为.看起来对象似乎修改了它的类. 二.模式解说 State模式主要解决的是在开发中时常遇到的根据不同的状态需要进行不同的处理操作的问题,而这样的问题,大部分人是采用switch-case语句进行处理的,这样会造成一个问题:分支过多,而且如果加入一个新的状态就需要对原来的代码进行编译.State模式采用了对这些不同的状态进行封装的方式处理这类问题,当状态改变的时候进行处理然后再切换到另一种状态,也就是说把状态的切换责任交给了具体的状态

设计模式学习笔记(十四)—Command模式

一.Command模式定义: 将一个请求封装为一个对象,从而使你不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. 二.模式解说 Commad模式是一种对象行为模式,它可以对发送者(sender)和接收者(receiver)完全解耦(decoupling).("发送者" 是请求操作的对象,"接收者" 是接收请求并执行某操作的对象.有了 "解耦",发送者对接收者的接口一无所知.)这里,"请求"(requ

设计模式学习笔记(十二)—Builder建造者模式

Builder模式定义: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 刚接触到这个模式的时候,实在搞不明白它的意思,有什么用.于是,上网google了一圈,终于得到这个大家普遍认可的解释: 建造模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们,用户不知道内部的具体构建细节. 下面举一个例子来说明这个模式的使用,代码如下: import java.util.ArrayList; interface Builder{ pub

hibernate3学习笔记(十八)|关系映射:一对多

接上例:http://blog.csdn.net/kunshan_shenbin/archive/2008/09/03/2873943.aspx User对Room是多对一的关系,那么反过来Room对User就是一对多的关系了. User.java: 1.package com.hb3.pack_17.model;2.3.public class User {4. 5. private Integer id;6. private String name;7.8. public User() {9

JavaScript权威设计--事件冒泡,捕获,事件句柄,事件源,事件对象(简要学习笔记十八)

1.事件冒泡与事件捕获 2.事件与事件句柄   3.事件委托:利用事件的冒泡技术.子元素的事件最终会冒泡到父元素直到跟节点.事件监听会分析从子元素冒泡上来的事件. 事件委托的好处:     1.每个函数都是对象,都会占用内存,内存中对象越多,性能越差.     2.必须事先指定所有事件处理程序而导致的DOM访问次数,会延迟整个页面的交互就绪时间. 怎样处理由于事件较多引起的性能差: 1.采用事件委托技术,限制简历的连接数量 2.在不需要的时候移除事件处理程序 例子: html: <div id=