行为型模式-中介者模式
来源:互联网 发布:微信小动画制作软件 编辑:程序博客网 时间:2024/05/21 22:37
中介者模式
用一个中介对象封装一系列对象(同事)的交互,中介者使各对象不需要显示地相互作用,从而使其耦合度松散,而且可以独立地改变他们之间的交互。
中介模式角色
抽象中介(Mediator)角色:该角色定义出同事对象到中介者对象的统一接口,用于各同事角色之间的通信;
具体中介(Concrete Mediator)角色:该角色实现抽象中介者,它依赖于各个同事角色,并通过协调各同事角色实现协作行为;
抽象同事(Colleague)角色:该角色定义出中介者到同事对象的接口,同事对象只知道中介者而不知道其余的同事对象;
具体同事(Concrete Colleague)角色:该角色实现抽象同事类,每一个具体同事类都清楚自己在小范围内的行为,而不知道大范围的目的。
中介者模式优点
减少类间的依赖,将原有一对多的依赖关系变成一对一的依赖,使得对象之间的关系更容易维护和理解;
避免同事对象之间的过度耦合,同事类只依赖于中介者,使同事类更容易被复用,中介类和同事类可以相对独立地演化;
中介者模式将对象的行为和协作抽象化,将对象在小尺度的行为上与其他对象的相互作用分开处理。
中介者模式缺点
中介者模式降低了同事对象的复杂度,但增加了中介者类的复杂性;
中介者类经常充满了各个具体同事类的关系协调代码,这种代码不能复用的。
例1:
package mediator;public abstract class Colleague {private Mediator mediator;//构造函数public Colleague(Mediator m){this.mediator = m;}//抽象活动方法,由子类实现public abstract void action();//业务方法,调用此方法改变对象的内部状态public void change(){this.mediator.colleagueChanged(this);}public Mediator getMediator() {return mediator;}public void setMediator(Mediator mediator) {this.mediator = mediator;}}
package mediator;//具体同事类public class ConcreteColleagueA extends Colleague {public ConcreteColleagueA(Mediator m) {super(m);// TODO Auto-generated constructor stub}@Overridepublic void action() {System.out.println("这是同事A执行的方法");}}
package mediator;//具体同事类public class ConcreteColleagueB extends Colleague {public ConcreteColleagueB(Mediator m) {super(m);// TODO Auto-generated constructor stub}@Overridepublic void action() {System.out.println("这是同事B执行的方法");}}
package mediator;//抽象中介者public interface Mediator {//中介模式的逻辑方法public abstract void colleagueChanged(Colleague c);}
package mediator;public class ConcreteMediator implements Mediator {private ConcreteColleagueA a;private ConcreteColleagueB b;//中介者模式的业务逻辑方法public void colleagueChanged(Colleague c) {c.action();}//工厂方法,创建同事对象public void createConcreteMediator(){a = new ConcreteColleagueA(this);b = new ConcreteColleagueB(this);}//获取同事对象Apublic ConcreteColleagueA getA() {return a;}//获取同事对象Bpublic ConcreteColleagueB getB() {return b;}}
package mediator;import mediator.Person.Sex;public class Client {public static void main(String[] args) {// TODO Auto-generated method stub//创建中介对象Mediator mediator = new ConcreteMediator();Colleague c = new ConcreteColleagueA(mediator);c.change();c = new ConcreteColleagueB(mediator);c.change();}}
例2:
package mediator;public abstract class Person {private String name;private int age;private Sex sex;private int requestAge;//要求的对象年龄,假设只有一个要求//持有个婚姻中介private MerriageAgency agency;public Person(String name,int age,Sex sex,int requestAge,MerriageAgency agency){this.name = name;this.age = age;this.sex = sex;this.requestAge = requestAge;this.agency = agency;//通过中介,注册会员this.agency.register(this);}enum Sex{MALE,FEMALE;}//寻找对象public void findPartner(){this.agency.pair(this);}public String getName() {return name;}public int getAge() {return age;}public Sex getSex() {return sex;}public int getRequestAge() {return requestAge;}public MerriageAgency getAgency() {return agency;}}
package mediator;public class Main extends Person {public Main(String name, int age, Sex sex, int requestAge,MerriageAgency agency) {super(name, age, sex, requestAge, agency);// TODO Auto-generated constructor stub}}
package mediator;public class Woman extends Person {public Woman(String name, int age, Sex sex, int requestAge,MerriageAgency agency) {super(name, age, sex, requestAge, agency);// TODO Auto-generated constructor stub}}
package mediator;//抽象中介婚姻介绍单位public interface MerriageAgency {//注册会员public void register(Person person);//配对public void pair(Person person);}
package mediator;import java.util.ArrayList;import java.util.List;import mediator.Person.Sex;public class ConcreteMerriageAgency implements MerriageAgency {//婚姻介绍所拥有的男会员private List<Main> men = new ArrayList<Main>();//女会员private List<Woman> women = new ArrayList<Woman>();public void register(Person person) {if(person.getSex() == Sex.MALE){men.add((Main) person);}else if(person.getSex() == Sex.FEMALE){women.add((Woman) person);}}@Overridepublic void pair(Person person) {if(person.getSex() == Sex.MALE){for(Woman woman : women){if(person.getRequestAge() == woman.getRequestAge()){System.out.println(person.getName() + "和"+woman.getName()+"配对成功");return;}}}else if(person.getSex() == Sex.FEMALE){for(Main main : men){if(person.getRequestAge() == main.getRequestAge()){System.out.println(person.getName() + "和"+main.getName()+"配对成功");return;}}}System.out.println(person.getName()+"配对失败");}}
package mediator;import mediator.Person.Sex;public class Client {public static void main(String[] args) {// TODO Auto-generated method stub//创建中介对象MerriageAgency agency = new ConcreteMerriageAgency();Person m1 = new Main("John",20,Sex.MALE,20, agency);Person m2 = new Main("Jak",22,Sex.MALE,22, agency);Person w1 = new Woman("Lily",0, Sex.FEMALE,22,agency);Person w2 = new Woman("Mary",20,Sex.FEMALE,21, agency);m1.findPartner();m2.findPartner();w1.findPartner();w2.findPartner();}}
0 0
- 中介者模式(行为型)
- 设计模式--行为型--中介者模式
- 行为型模式之中介者模式
- 行为型模式1:中介者模式
- 行为型模式-Mediator ( 中介者模式 )
- 行为型模式-中介者模式
- 行为型设计模式-中介者模式
- 行为模式-中介者模式
- 行为模式-中介者模式
- 中介者模式 - 行为模式
- 行为型之中介者模式
- Mediator中介者(行为型设计模式)
- 行为型模式-中介者mediator
- 中介者模式(行为型)
- 行为型模式之中介者MEDIATOR
- 行为型之中介者模式
- 行为型模式-中介者(mediator)
- 行为型-中介者模式(Mediator)
- C语言函数栈调用二
- log4j配置
- 黑马程序员 c语言 实现对四百年大润的判定
- Java - Thinking in Java 第6章 访问权限控制
- 乘法通过查表实现
- 行为型模式-中介者模式
- 【CodeVS2885】钉子与小球
- 测试 hosts
- 如何更新远程主机上的 Linux 内核
- ROS学习--(十六)roswtf
- hdu1394 Minimum Inversion Number 线段树
- GIT和SVN之间的五个基本区别
- GAM(广义相加模型)概要及R程序实现
- springMVC学习笔记---controller中实现多个方法