设计模式--中介模式

定义与结构

GOF给中介者模式下的定义是:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它 们之间的交互。简单点来说,将原来两个直接引用或者依赖的对象拆开,在中间加入一个“中介”对象,使得两头的对象分别和“中介”对象引用或者依赖。

当然并不是所有的对象都需要加入“中介”对象。如果对象之间的关系原本一目了然,中介对象的加入便是“画蛇添足”。

来看下中介者模式的组成部分吧。

1) 抽象中介者(Mediator)角色:抽象中介者角色定义统一的接口用于各同事角色之间的通信。

2) 具体中介者(Concrete Mediator)角色:具体中介者角色通过协调各同事角色实现协作行为。为此它要知道并引用各个同事角色。

3) 同事(Colleague)角色:每一个同事角色都知道对应的具体中介者角色,而且与其他的同事角色通信的时候,一定要通过中介者角色协作。

来自《设计模式》一书的类图:


由于中介者的行为与要使用的数据与具体业务紧密相关,抽象中介者角色提供一个能方便很多对象使用的接口是不太现实的。所以抽象中介者角色往往是不存在 的,或者只是一个标示接口。如果有幸能够提炼出真正带有行为的抽象中介者角色,我想同事角色对具体中介者角色的选择也是策略的一种应用。

1:具体的中介者接口:这里定义两个方法,一个简单的构造一个,通知同事的改变。

package mediator;

/**
 * 中介者的接口
 * @author zero
 *
 */
public interface Mediator {

	
	public void createColleagues();


	public void colleagueChanged(Colleague colleague);

}
 2:定义一个同事的抽象类:这里面别忘了把中介加进去。要不中介可不知道同事的改变。
package mediator;
/**
 * 同事类
 * @author zero
 *
 */

public abstract class Colleague {

	
	private final Mediator fMediator;

	public Colleague(Mediator mediator) {
		super();
		fMediator = mediator;
		
	}
	protected void changed() {
		fMediator.colleagueChanged(this);
	}
	
}
 3:一个具体的中介者:这里为了区分是哪个同事类发生改变,给同事类的子类增加了,name的标签。
package mediator;
/**
 * 具体的中介者实现
 * @author zero
 *
 */
public class ConcreteMediator implements Mediator {

	public void createColleagues() {
		
	}

	public void colleagueChanged(Colleague colleague) {
		System.out.println(((ConcreteColleague)colleague).getName()+"同事发生改变了");
	}

}
 4:一个具体的同事类:继承同事类,多增加一个署名方法。
package mediator;

/**
 * 具体的中介同事
 * 
 * @author zero
 * 
 */
public class ConcreteColleague extends Colleague {

	private final String name;
	
	public ConcreteColleague(Mediator mediator, String name) {
		super(mediator);
		this.name=name;
	}

	public String getName() {
		return name;
	}

	
}
 5:最后我们的测试类:
package mediator;

public class MediatorTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Mediator mediator = new ConcreteMediator();
		Colleague colleague1 = new ConcreteColleague(mediator,"one");
		colleague1.changed();
		Colleague colleague2 = new ConcreteColleague(mediator,"two");
		colleague2.changed();
	}

}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值