Mediator-----设计模式

1.中介者设计模式,这个主要的使用场景是,当多个对象之间有数据交互时,它们之间不直接通信,而是把要发送的数据交给中介者,中介者完成相应处理,按一定的条件发给目标对象。

2.首先一个示例,USA,Iraq,这两个类继承Country这个类,UnitedNationSecurityCouncil继承UnitedNations是中介者角色,它负责传达信息。

package com.war;

abstract class UnitedNations {
	public abstract void Declare(String message, Country colleague);
}

abstract class Country {
	protected UnitedNations un;
	public Country(UnitedNations un) {
		this.un = un;
	}
	
}

class USA extends Country {
	public USA(UnitedNations mediator) {
		super(mediator);
	}
	public void Declare(String message) {
		un.Declare(message, this);
	}
	public void GetMessage(String message) {
		System.out.println("美方获得的信息是: " + message); 
	}
}

class Iraq extends Country {
	public Iraq(UnitedNations mediator) {
		super(mediator);
	}
	public void Declare(String message) {
		un.Declare(message, this);
	}
	public void GetMessage(String message) {
		System.out.println("伊拉克获得的信息是: " + message); 
	}
}

class UnitedNationSecurityCouncil extends UnitedNations {
	private USA usa;
	private Iraq iraq;
	
	public void setUSA(USA usa) {
		this.usa = usa;
	}
	public void setIraq(Iraq iraq) {
		this.iraq = iraq;
	}
	@Override
	public void Declare(String message, Country colleague) {
		if (colleague == usa) {
			iraq.GetMessage(message);
		}
		else {
			usa.GetMessage(message);
		}
		
	}
	
}


public class Main {
	public static void main(String[] args) {
		UnitedNationSecurityCouncil unsc = new UnitedNationSecurityCouncil();
		USA usa = new USA(unsc);
		Iraq iraq = new Iraq(unsc);
		unsc.setIraq(iraq);
		unsc.setUSA(usa);
		usa.Declare("你妈的!");
		iraq.Declare("想要我们的石油!");
	}
	
	
}

3.这是一个比较复杂的示例,一个登陆窗口的设计,窗口上有TextFile,Button,Checkbox等组件,它们是否可用是有一定的关系的,而LoginFrame继承Mediator来处理这样的关系,它充当了中介者的角色。

package com.cn;

import java.awt.Button;
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;

interface Mediator {
	public abstract void createColleagues();
	public abstract void colleagueChanged(Colleague colleague);
}

interface Colleague {
	public abstract void setMediator(Mediator mediator);
	public abstract void setColleagueEnabled(boolean enabled);
}

class ColleagueButton extends Button implements Colleague {
	
	private static final long serialVersionUID = 1L;
	private Mediator mediator;
	public ColleagueButton(String caption) {
		super(caption);
	}
	public void setMediator(Mediator mediator) {
		this.mediator = mediator;
	}
	public void setColleagueEnabled(boolean enabled) {
		setEnabled(enabled);
	}
	
}

class ColleagueTextField extends TextField implements TextListener, Colleague {
	
	private static final long serialVersionUID = 1L;
	private Mediator mediator;
	public ColleagueTextField(String text, int columns) {
		super(text, columns);
	}
	public void setMediator(Mediator mediator) {
		this.mediator = mediator;
	}
	public void setColleagueEnabled(boolean enabled) {
		setEnabled(enabled);
		setBackground(enabled ? Color.white : Color.lightGray);
	}
	public void textValueChanged(TextEvent e) {
		mediator.colleagueChanged(this);
	}
}



class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague {
	private static final long serialVersionUID = 1L;
	private Mediator mediator;
	public ColleagueCheckbox(String caption, CheckboxGroup group, boolean state) {
		super(caption, group, state);
	}
	public void setMediator(Mediator mediator) {
		this.mediator = mediator;
	}
	public void setColleagueEnabled(boolean enabled) {
		setEnabled(enabled);
	}
	public void itemStateChanged(ItemEvent e) {
		System.out.println("2");
		mediator.colleagueChanged(this);
	}
}



class LoginFrame extends Frame implements ActionListener, Mediator {
	
	private static final long serialVersionUID = 1L;
	private ColleagueCheckbox checkGuest;
	private ColleagueCheckbox checkLogin;
	private ColleagueTextField textUser;
	private ColleagueTextField textPass;
	private ColleagueButton buttonOk;
	private ColleagueButton buttonCancel;
	
	public LoginFrame(String title) {
		super(title);
		setBackground(Color.lightGray);
		setLayout(new GridLayout(4, 2));
		createColleagues();
		add(checkGuest);
		add(checkLogin);
		add(new Label("Username:"));
		add(textUser);
		add(new Label("Password:"));
		add(textPass);
		add(buttonOk);
		add(buttonCancel);
		colleagueChanged(checkGuest);
		pack();
		setVisible(true);
	}
	
	public void createColleagues() {
		CheckboxGroup g = new CheckboxGroup();
		checkGuest = new ColleagueCheckbox("Guest", g, true);
		checkLogin = new ColleagueCheckbox("Login", g, false);
		textUser = new ColleagueTextField("", 10);
		textPass = new ColleagueTextField("", 10);
		textPass.setEchoChar('*');
		buttonOk = new ColleagueButton("ok");
		buttonCancel = new ColleagueButton("cancel");
		checkGuest.setMediator(this);
		System.out.println("1");
		checkLogin.setMediator(this);
		textUser.setMediator(this);
		textPass.setMediator(this);
		buttonOk.setMediator(this);
		buttonCancel.setMediator(this);
		
		checkGuest.addItemListener(checkGuest);
		checkLogin.addItemListener(checkLogin);
		textUser.addTextListener(textUser);
		textPass.addTextListener(textPass);
		buttonOk.addActionListener(this);
		buttonCancel.addActionListener(this);
	}
	
	public void colleagueChanged(Colleague c) {
		if (c == checkGuest || c == checkLogin) {
			if (checkGuest.getState()) {
				textUser.setColleagueEnabled(false);
				textPass.setColleagueEnabled(false);
				buttonOk.setColleagueEnabled(true);
			}
			else {
				textUser.setColleagueEnabled(true);
				userpassChanged();
			}
		}
		else if (c == textUser || c == textPass) {
			userpassChanged();
		} else {
			System.out.println("colleagueChanged:unknown colleague = " + c);
		}
	}

	private void userpassChanged() {
		if (textUser.getText().length() > 0) {
			textPass.setColleagueEnabled(true);
			if (textPass.getText().length() > 0) {
				buttonOk.setColleagueEnabled(true);
				System.out.println("ss");
			} else {
				System.out.println("ss3");
				buttonOk.setColleagueEnabled(false);
			}
		} else {
			textPass.setColleagueEnabled(false);
			buttonOk.setColleagueEnabled(false);
		}
	}

	public void actionPerformed(ActionEvent e) {
		System.out.println("" + e);
		System.exit(0);
	}
	

	
	
}


public class Main {
	public static void main(String[] args) {
		new LoginFrame("Mediator Sample");
	}
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值