中介者模式(Mediator)

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


@@@练习示例: 
使用电脑来看电影。


@@@示例代码:
\film\Mediator.java

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package film;

/**
 * 中介者对象的接口
 */
public interface Mediator {
    /**
     * 同事对象在自身改变的时候来通知中介者的方法,
     * 让中介者去负责相应的与其他同事对象的交互
     * @param colleague 同事对象自身,好让中介者对象通过对象实例
     * 去获取同事对象的状态
     */
	public void changed(Colleague colleague);
}

\film\MotherBoard.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package film;

/**
 * 主板类, 实现中介者接口
 */
public class MotherBoard implements Mediator {
    /**
     * 需要知道要交互的同事类——光驱类
     */
	private CDDriver cdDriver = null;
	
	/**
	 * 需要知道要交互的同事类——CPU类
	 */
	private CPU cpu = null;
	
	/**
	 * 需要知道要交互的同事类——显卡类
	 */
	private VideoCard videoCard = null;
	
	/**
	 * 需要知道要交互的同事类——声卡类
	 */
	private SoundCard soundCard = null;
	
	public void setCdDriver(CDDriver cdDriver) {
		this.cdDriver = cdDriver;
	}

	public void setCpu(CPU cpu) {
		this.cpu = cpu;
	}

	public void setVideoCard(VideoCard videoCard) {
		this.videoCard = videoCard;
	}

	public void setSoundCard(SoundCard soundCard) {
		this.soundCard = soundCard;
	}

	public void changed(Colleague colleague) {
        if(colleague == cdDriver) {
        	// 表示光驱读取数据了
        	this.opeCDDriverReadData((CDDriver)colleague);
        } else if(colleague == cpu) {
            // 表示CPU处理完了	
        	this.opeCPU((CPU)colleague);
        }
	}
	
	/**
	 * 处理光驱读取数据以后与其他对象的交互
	 * @param cd 光驱同事对象
	 */
	private void opeCDDriverReadData(CDDriver cd) {
		// 1: 先获取光驱读取的数据
		String data = cd.getData();
		// 2: 把这些数据传递给CPU进行处理
		this.cpu.executeData(data);
	}
	
	/**
	 * 处理CPU处理处理完数据后与其他对象的交互
	 * @param cpu CPU同事类
	 */
	private void opeCPU(CPU cpu) {
		// 1: 先获取CPU处理后的数据
		String videoData = cpu.getVideoData();
		String soundData = cpu.getSoundData();
		// 2: 把这些数据传递给显卡和声卡展示出来
		this.videoCard.showData(videoData);
		this.soundCard.soundData(soundData);
	}
}

\film\Colleague.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package film;

/**
 * 光驱类,一个同事类
 */
public abstract class Colleague {
    private Mediator mediator;
    
    public Colleague(Mediator mediator) {
    	this.mediator = mediator;
    }
    
    public Mediator getMediator() {
    	return mediator;
    }
}

\film\CDDriver.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package film;

/**
 * 光驱类,一个同事类
 */
public class CDDriver extends Colleague {
	public CDDriver(Mediator mediator) {
		super(mediator);
	}
    
	/**
	 * 光驱读取出来的数据
	 * (自身的业务状态数据)
	 */
	private String data = ""; 
	
	/**
	 * 获取光驱读取出来的数据
	 * @return 光驱读取出来的数据
	 */
	public String getData() {
		return this.data;
	}
	
	/**
	 * 读取光盘
	 * (业务方法,也是和中介者交互的方法)
	 */
	public void readCD() {
		// 逗号前是视频显示的数据,逗号后是声音
		this.data = "设计模式,值得好好研究";
		// 通知主板,自己的状态发生了改变
		this.getMediator().changed(this);
	}
}

\film\CPU.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package film;

/**
 * CPU类, 一个同事类
 */
public class CPU extends Colleague {
	public CPU(Mediator mediator) {
		super(mediator);
	}
    
	/**
	 * 分解出来的视频数据
	 */
	private String videoData = "";
	
	/**
	 * 分解出来的声音数据
	 */
	private String soundData = "";
	
	/**
	 * 获取分解出来的视频数据
	 * @return 分解出来的视频数据
	 */
	public String getVideoData() {
		return this.videoData;
	}
	
	/**
	 * 获取分解出来的声音数据
	 * @return 分解出来的声音数据
	 */
	public String getSoundData() {
		return this.soundData;
	}
	
	/**
	 * 处理数据, 把数据分成音频和视频的数据
	 * @param data 被处理的数据
	 * (业务方法, 也是和中介者交互的方法)
	 */
	public void executeData(String data) {
		// 把数据分解开, 前面的是视频数据, 后面的是音频数据
		String[] ss = data.split(",");
		this.videoData = ss[0];
		this.soundData = ss[1];
		// 通知主板, CPU的工作完成
		this.getMediator().changed(this);
	}
}

\film\VideoCard.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package film;

/**
 * 显卡类, 一个同事类
 */
public class VideoCard extends Colleague {
	public VideoCard(Mediator mediator) {
		super(mediator);
	}
    
	/**
	 * 显示视频数据
	 * @param data 被显示的数据
	 */
	public void showData(String data) {
		System.out.println("您正在观看的是: " + data);
	}
}

\film\SoundCard.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package film;

/**
 * 声卡类, 一个同事类
 */
public class SoundCard extends Colleague {
	public SoundCard(Mediator mediator) {
		super(mediator);
	}
    
	/**
	 * 按照声频数据发出声音
	 * @param data 发出声音的数据
	 */
	public void soundData(String data) {
		System.out.println("画外音: " + data);
	}
}

\user\Client.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package user;

import film.CDDriver;
import film.CPU;
import film.MotherBoard;
import film.SoundCard;
import film.VideoCard;

public class Client {
    public static void main(String[] args) {
    	// 1: 创建中介者——主板对象
    	MotherBoard mediator = new MotherBoard();
    	// 2: 创建同事类
    	CDDriver cd = new CDDriver(mediator);
    	CPU cpu = new CPU(mediator);
    	VideoCard vc = new VideoCard(mediator);
    	SoundCard sc = new SoundCard(mediator);
    	
    	// 3: 让中介者知道所有的同事
    	mediator.setCdDriver(cd);
    	mediator.setCpu(cpu);
    	mediator.setVideoCard(vc);
    	mediator.setSoundCard(sc);
    	
    	// 4: 开始看电影, 把光盘放入光驱, 光驱开始读盘
    	cd.readCD();
    }
}

@@@模式的实现:
1. 可以实现成广义中介者;


@@@模式的优点:
1. 松散耦合;
2. 集中控制交互;
3. 多对多变成一对多;


@@@模式的缺点:
1. 过度集中化;


@@@模式的本质:
封装交互。


@@@模式体现的设计原则:
NA


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值