当前位置 : 主页 > 手机开发 > harmonyos >

设计模式学习笔记——中介者模式

来源:互联网 收集:自由互联 发布时间:2023-08-26
定义: 用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示的互相交互,从而使其耦合松散,而且可以独立的改变他们之间的交互。 模式动机: 1、在面向对象的软件设


定义:

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


模式动机:

1、在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责。


2、对于一个模块,可能由很多对象构成,而且这些对象之间可能存在相互的引用, 为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式 ,这就是中介者模式的模式动机。



实例分析:虚拟聊天室

某论坛系统欲增加一个虚拟聊天室,允许论坛会员通过该聊天室进行信息交流,普通会员(CommonMember)可以给其他会员发送文本信息,钻石会员(DiamondMember)既可以给其他会员发送文本信息,还可以发送图片信息。

在本例中,聊天室就是中介者的角色,会员之间的沟通都通过中介者,这样就将错综复杂的会员关系,变得有条有理了。

其类图如下:

设计模式学习笔记——中介者模式_class


其实现代码如下:

public abstract class AbstractChatRoom {
	
	public abstract void register(Member member);
	
	public abstract void sendText(String from, String to, String text);
	
	public abstract void sendImage(String from, String to, String image);
}
public class ChatRoomGroup extends AbstractChatRoom {
	
	private Map<String,Member> members=new HashMap<String,Member>();
	
	@Override
	public void register(Member member) {
		if(members.containsKey(member.getName()))
			System.out.println("已被注册!");
		else
		{
			this.members.put(member.getName(), member);
			member.setRoom(this);//要在这里将会员中的ChatRoomGroup设置为本类对象
		}
	}

	@Override
	public void sendText(String from, String to, String text) {
		
		if(members.containsKey(from) && members.containsKey(to)){
			Member mTo=members.get(to);
			mTo.receiveText(from, text);
		}
		
	}

	@Override
	public void sendImage(String from, String to, String image) {
		if(members.containsKey(from) && members.containsKey(to)){
			Member mTo=members.get(to);
			mTo.receiveImage(from, image);
		}
	}
	
}
public abstract class Member {
	
	protected String name;
	protected AbstractChatRoom room;
	
	public Member(String name){
		this.name=name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public AbstractChatRoom getRoom() {
		return room;
	}
	public void setRoom(AbstractChatRoom room) {
		this.room = room;
	}
	
	public abstract void sendText(String to, String text);
	
	public abstract void sendImage(String to, String image);
	
	public void receiveText(String from , String text){
		System.out.println(this.name+" receive text from "+from+": "+text);
	}
	
	public void receiveImage(String from , String image){
		System.out.println(this.name+" receive image from "+from+": "+image);
	}
}
/*
 * 钻石会员可以发送文本和图片
 */
public class DiamondMember extends Member {
	
	public DiamondMember(String name) {
		super(name);
	}

	@Override
	public void sendText(String to, String text) {
		super.room.sendText(this.name, to, text);
	}

	@Override
	public void sendImage(String to, String image) {
		super.room.sendImage(this.name, to, image);
	}

}
/*
 * 普通会员只可以发送文本,不可以发送图片
 */
public class CommonMember extends Member {

	public CommonMember(String name) {
		super(name);
	}

	@Override
	public void sendText(String to, String text) {
		super.room.sendText(this.name, to, text);
	}

	@Override
	public void sendImage(String to, String image) {
		System.out.println("普通会员不能发送图片");
	}

}
public class Client {
	public static void main(String[] args) {
		
		AbstractChatRoom chatRoomGroup=new ChatRoomGroup();
		
		Member m1=new DiamondMember("piao");
		chatRoomGroup.register(m1);
		
		Member m2=new CommonMember("suo");
		chatRoomGroup.register(m2);
		
		Member m3=new DiamondMember("datou");
		chatRoomGroup.register(m3);
		
		m2.sendText("piao", "hello!");
		m2.sendImage("piao", "picture");
		
		m1.sendText("suo", "How are you ?");
		m1.sendImage("suo", "/cy");
		
		m3.sendText("suo", "xixi");
	}
}




中介者模式的优点:




简化了对象之间的交互。


将各同事解耦。


减少子类生成。


可以简化各同事类的设计和实现。






中介者模式的缺点


在具体中介者类中包含了同事之间的交互细节,可能会导致 具体中介者类非常复杂 ,使得 系统难以维护 。




网友评论