java mediator_java—mediator中介模式

中介者模式是由GoF提出的23种软件设计模式的一种。Mediator模式是行为模式之一,Mediator模式定义:用一个中介者对象来封装一系列的对象交互。中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。

适用性

1)一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。

2)一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。

3)想定制一个分布在多个类的行为,而又不想生成太多的子类。

结构图如下

1a4c510f05f1ab166059f321.jpg

colleague向一个中介者对象发送和接受请求。中介者在各个colleague间适当的转发请求以实现协作行为。

优缺点

1)减少了子类生成Mediator将原本分布于多个对象间的行为集中在一起,改变这些行为只需生成Mediator的子类即可,这样各个Colleague类可被重用。

2)它将各Colleague解耦。Mediator有利于各Colleague间的松耦合,你可以独立的改变和复用各Colleague类和Mediator类。

3)它简化了对象协议用Mediator和各Colleague间的一对多的交互来代替多对多的交互。一对多的关系更易于理解、维护和扩展。

4)它对对象如何协作进行了抽象将中介作为一个独立的概念并将其封装在一个对象中,使你将注意力从对象各自本身的行为转移到它们之间的交互上来。这有助于弄清楚一个系统中的对象是如何交互的。

5)它使控制集中化,中介者模式将交互的复杂性变为中介者的复杂性。因为中介者封装了协议,它可能变得比任一个Colleague都复杂。这可能使得中介者自身成为一个难于维护的庞然大物。

1、Colleague.java:

package mediator;

public abstract class Colleague {

private Mediator mediator;

private String message;

public Colleague(Mediator m){

mediator = m;

}

public Mediator getMediator(){

return mediator;

}

public String getMessage(){

return message;

}

public void setMessage(String message){

this.message = message;

}

public abstract void sendMsg(Colleague colleague);

public abstract void getMsg(Colleague colleague);

}

2、Colleague的子类:Colleague1,Colleague2,Colleague3

package mediator;

public class Colleague1 extends Colleague{

public Colleague1(Mediator m){

super(m);

}

@Override

public void getMsg(Colleague colleague) {

getMediator().action(colleague,0);

//System.out.println("Colleague1 has got the message-"+"");

}

@Override

public void sendMsg(Colleague colleague) {

getMediator().action(colleague,1);

//System.out.println("Colleague1 has send the message "+msg+"");

}

}

package mediator;

public class Colleague2 extends Colleague{

public Colleague2(Mediator m){

super(m);

}

@Override

public void getMsg(Colleague colleague) {

getMediator().action(colleague,0);

//System.out.println("Colleague2 has got the message-"+"");

}

@Override

public void sendMsg(Colleague colleague) {

getMediator().action(colleague,1);

//System.out.println("Colleague2 has send the message "+msg+"");

}

}

package mediator;

public class Colleague3 extends Colleague{

public Colleague3(Mediator m){

super(m);

}

@Override

public void getMsg(Colleague colleague) {

getMediator().action(colleague,0);

//System.out.println("Colleague3 has got the message-"+"");

}

@Override

public void sendMsg(Colleague colleague) {

getMediator().action(colleague,1);

//System.out.println("Colleague3 has send the message "+msg+"");

}

}

3、Mediator抽象类:

package mediator;

public abstract class Mediator {

/**

* @param sender

* @param flag   0是读,1是发送

*/

public abstract void action(Colleague sender,int flag);//mediator针对colleague的一个交互行为

public abstract void addCollegue(Colleague colleague);//加入mediator对象

}

4、Mediator的子类:

package mediator;

import java.util.ArrayList;

import java.util.List;

public class ConcreteMediator extends Mediator{

private List  member = new ArrayList();

@Override

public void action(Colleague sender,int flag) {

String msg = sender.getMessage();

for(Colleague colleague : member){

if(colleague.equals(sender)){

if(flag==0){

System.out.println("这是从"+sender+"接收到的消息:"+sender.getMessage());

}else{

sender.setMessage("test.......");

}

break;

}

}

}

@Override

public void addCollegue(Colleague colleague) {

member.add(colleague);

}

}

5、测试类:

package mediator;

public class MediatorTEST {

public static void main(String[] args){

Mediator mediator = new ConcreteMediator();

Colleague colleague1 = new Colleague1(mediator);

Colleague colleague2 = new Colleague2(mediator);

Colleague colleague3 = new Colleague3(mediator);

mediator.addCollegue(colleague1);

mediator.addCollegue(colleague2);

mediator.addCollegue(colleague3);

// Colleague1 触发行为

colleague1.setMessage("嗨,大家好!");

// Colleague2 触发行为

colleague2.setMessage("很高兴见到你!");

// Colleague3 触发行为

colleague3.setMessage("我们一起玩游戏吧!");

colleague1.getMsg(colleague2);

colleague1.sendMsg(colleague2);

colleague1.getMsg(colleague2);

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第五节:泛型(泛型类、接口、方法、委托、泛型约束、泛型缓存、逆变和协变)

一. 泛型诞生的背景 在介绍背景之前,先来看一个案例,要求:分别输出实体model1、model2、model3的id和name值,这三个实体有相同的属性名字id和name。 1 public class myUtils2 {3 //要求:分别输出实体model1、model2、…

第六节:反射(几种写法、好处和弊端、利用反射实现IOC)

一. 加载dll,读取相关信息 1. 加载程序集的三种方式 调用Assembly类下的三个方法:Load、LoadFile、LoadFrom。 1       //1.1 Load方法:动态默认加载当前路径下的(bin)下的dll文件,不需要后缀 2 Assembly assembly Assembly.Load(&…

第七节:语法总结(1)(自动属性、out参数、对象初始化器、var和dynamic等)

一. 语法糖简介 语法糖也译为糖衣语法,是由英国计算机科学家彼得约翰兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说…

java不用插件播放媒体文件_java servlet不用插件上传文件:

展开全部import java.net.*;import java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;public class SaveFileServlet extends HttpServlet{FileWriter savefile;String filename null;String value null;/*** Handles a POST request*/publ…

第八节:语法总结(2)(匿名类、匿名方法、扩展方法)

一. 匿名类 1. 传统的方式给类赋值,需要先建一个实体类→实例化→赋值,步骤很繁琐,在.Net 3.0时代,微软引入匿名类的概念,简化了代码编写,提高了开发效率。 匿名类的声明语法: var objnew {字段…

第九节:委托和事件(1)(委托的发展历史、插件式编程、多播委托)

一. 委托的发展历史和基本用法 说起委托,每个人可能都会对他有不同的理解,结合实战中委托的使用,我对其理解是:委托和类一样,是用户的一个自定义类型,委托可以有参数、有返回值,委托的关键字是d…

第十节:委托和事件(2)(泛型委托、Func和Action、事件及与委托的比较)

一. 泛型委托 所谓的泛型委托,即自定义委托的参数可以用泛型约束,同时内置委托Func和Action本身就是泛型委托。 将上一个章节中的Calculator类中的方法用自定义泛型委托重新实现一下。 1 public class Calculator22 {3 //传统解决方案一&am…

java+sm4+加密算法_SM4加密算法实现Java和C#相互加密解密

https://www.cnblogs.com/miaoziblog/p/9040473.html近期由于项目需要使用SM4对数据进行加密,然后传给Java后台,Java后台使用的也是SM4的加密算法但是就是解密不正确,经过一步步调试发现Java中好多数据类型与C#的相同的数据类型是存在不同的比…

DotNet进阶系列

一. 回顾历史 回顾个人发展历程,自2012年初次接触开发至今(2018年)已经有六个年头,这期间陆陆续续学习并掌握了不少技术,C#语言、ORM框架、多线程技术、设计模式、前端技术、MVC、MVVM框架思想等等,每种技术随着多次使用&#xff…

第十一节:特性(常见的特性标签、自定义特性、特性的使用案例)

一. 基本概念 1. 什么是特性? MSDN官方给出的定义时:公共语言运行时允许添加类似关键字的描述声明,叫做特性,它对程序中的元素进行标注,如类型、字段、方法和属性等。Attribute和Microsoft .Net Framework文件的元数据&#xff…

第十二节:Lambda、linq、SQL的相爱相杀(1)

一. 谈情怀 Lambda、Linq、SQL伴随着我的开发一年又一年,但它们三者并没有此消彼长,各自占有这一定的比重,起着不可替代的作用。 相信我们最先接触的应该就是SQL了,凡是科班出身的人,大学期间都会学习SQL Server数据库…

php java 共享session_PHP 实现多服务器共享 SESSION 数据

一、问题起源稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网站,用户系统是统一的,即一套用户名、密码在整个网站的各个模块中都是可以登录…

第十三节:Lambda、linq、SQL的相爱相杀(2)

一. Linq开篇 1.Where用法 linq中where的用法与SQL中where的用法基本一致。 1 #region 01-where用法2 {3 //1. where用法4 //1.1 查询账号为admin的用户信息5 Console.WriteLine("------------…

第十四节:Lambda、linq、SQL的相爱相杀(3)

一. SQL 开篇 1. where用法 1    #region 封装EF调用SQL语句查询 2 public static List<T> ExecuteQuery<T>(string sql, params SqlParameter[] pars) 3 { 4 return db.Database.SqlQuery<T>(sql, pars).ToList(); 5 …

第十五节:Expression表达式目录树(与委托的区别、自行拼接、总结几类实例间的拷贝)

一. 基本介绍 回忆&#xff1a; 最早接触到表达式目录树(Expression)可能要追溯到几年前使用EF早期的时候&#xff0c;发现where方法里的参数是Expression<Func<T,bool>>这么一个类型&#xff0c;当初不是很理解&#xff0c;只是知道传入lambda表达式使用即可&…

IIS Web 服务器/ASP.NET 运行原理基本知识概念整理

前言&#xff1a; 记录 IIS 相关的笔记还是从公司笔试考核题开始的&#xff0c;问 Application Pool 与 AppDomain 的区别&#xff1f; 促使我对进程池进了知识的学习&#xff0c;所以记录一下学习的笔记。 我们知道现在 .NET 就业来看&#xff0c;80% 的 .NET 程序员都是从事 …

Http请求处理流程

从一个页面比如www.xuxiaoyu.net的请求开始如何就能打开blogs页面的呢&#xff1f;这其中发生了什么样的东西&#xff1f; Http请求(Http Request) 当服务器&#xff08;IIS&#xff09;接受到一个Http请求的时候进行以下步骤的处理&#xff1a; 1)服务器获取所请求的页面的后缀…

iis到w3wp的数据流及工作原理

HTTP.sys->IO线程-CLR线程池中的worker线程处理 IO线程只负责把请求交给Worker线程或者放入进程池级别的队列,然后又去HTTP.SYS的队列中处理其它的请求

php云解析播放器,xyplay云解析PHPV3.4.1优化稳定版视频解析

演示地址&#xff1a;如有演示站请以演示为准&#xff0c;无演示站以截图为准,源码太多服务器有限&#xff0c;无法搭建所有源码演示站&#xff0c;请谅解&#xff01;新手购买指导&#xff1a;1.在本站注册账号 丨 2.登录已注册账号充值源码所需金币 丨 3.登录账号下载所需源码…

php version.,PHP_VERSION指什么

PHP_VERSION (string)当前的PHP版本&#xff0c;以字符串形式“ major.minor.release [extra]”表示。 (推荐学习&#xff1a;PHP视频教程)例如&#xff1a;<?php // PHP_VERSION_ID 自 PHP 5.2.7 起有效&#xff0c;// 如果我们的版本低于该版本&#xff0c;则用以下代码来…