中介者
中介者模式:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。
//创建门派抽象类package com.md.tertium;//门派抽象类public abstract class School {protected IPatternAlliance patternAlliance;public School(IPatternAlliance patternAlliance) {super();this.patternAlliance = patternAlliance;}//防御public void defense() {System.out.println( getName() + "防御" );}//攻击public void attack(School school) {System.out.println( getName() + "攻击" + school.getName() );}//有了中介者,将由中介者处理public void attackByPatternAlliance(School school) {patternAlliance.resolveAttack( this, school );}//门派攻击public void defenseByPatternAlliance() {patternAlliance.attack( this );}public abstract String getName();}package com.md.tertium;//中介者public class MediatorSchool extends School {public MediatorSchool(IPatternAlliance patternAlliance) {super( patternAlliance );}@Overridepublic String getName() {return "中介者神阁";}}package com.md.tertium;public class CommandSchool extends School {public CommandSchool(IPatternAlliance patternAlliance) {super( patternAlliance );}@Overridepublic String getName() {return "命令门";}}package com.md.tertium;public class SingletonSchool extends School {public SingletonSchool(IPatternAlliance patternAlliance) {super( patternAlliance );}@Overridepublic String getName() {return "单例宗";}}package com.md.tertium;public class StrategySchool extends School {public StrategySchool(IPatternAlliance patternAlliance) {super( patternAlliance );}@Overridepublic String getName() {return "策略";}}package com.md.tertium;import java.util.List;//模式联盟 中介者接口public interface IPatternAlliance {//提供一个加入联盟的接口public abstract void add(School school);//防御联盟public abstract void resolveAttack(School activeSide, School passiveSide);//攻击联盟public abstract void attack(School passiveSide);}package com.md.tertium;import java.util.LinkedList;import java.util.List;//联盟模式的具体实现public class PatternAlliance implements IPatternAlliance {private List <School> schoolList = new LinkedList <School>();@Overridepublic void add(School school) {//加入联盟schoolList.add( school );}@Overridepublic void resolveAttack(School activeSide, School passiveSide) {if (schoolList.contains( passiveSide )) {System.out.println( "被攻方" + passiveSide.getName() + "已加入联盟,联盟将齐力防御!" );for (School school : schoolList) {school.defense();}} else {System.out.println( "被攻方" + passiveSide.getName() + "未加入联盟,联盟不给予防御帮助!" );passiveSide.defense();}}@Overridepublic void attack(School passiveSide) {if (schoolList.contains( passiveSide ) && schoolList.contains( passiveSide )) {System.out.println( "主攻方" + passiveSide.getName() + "以及被攻方" + passiveSide.getName() + "都已加入联盟,不允许内讧!" );} else if (schoolList.contains( passiveSide ) && !schoolList.contains( passiveSide )) {System.out.println( "主攻方" + passiveSide.getName() + "已加入联盟,被攻方" + passiveSide.getName() + "不在联盟之中,将集体攻打该门派!" );for (School school : schoolList) {school.attack( passiveSide );}} else {System.out.println( "主攻方" + passiveSide.getName() + "未加入联盟,联盟无权干预此事!" );passiveSide.attack( passiveSide );}}}package com.md.tertium;public class Main {public static void main(String[] args) {// School singletonSchool = new SingletonSchool();// School commandSchool = new CommandSchool();// School mediatorSchool = new MediatorSchool();//// singletonSchool.attack( mediatorSchool );// commandSchool.attack( mediatorSchool );//// mediatorSchool.defense();IPatternAlliance patternAlliance = new PatternAlliance();School singletonSchool = new SingletonSchool( patternAlliance );School commandSchool = new CommandSchool( patternAlliance );School mediatorSchool = new MediatorSchool( patternAlliance );School strategySchool = new StrategySchool( patternAlliance );//策略宫没有被联盟收留patternAlliance.add( mediatorSchool );patternAlliance.add( commandSchool );patternAlliance.add( singletonSchool );singletonSchool.attackByPatternAlliance( mediatorSchool );commandSchool.attackByPatternAlliance( mediatorSchool );System.out.println( "------------------------------------------------------" );mediatorSchool.attackByPatternAlliance( strategySchool );System.out.println( "------------------------------------------------------" );strategySchool.attackByPatternAlliance( mediatorSchool );mediatorSchool.defenseByPatternAlliance();System.out.println( "------------------------------------------------------" );}}
《中介者模式》针对的问题是,解决一系列对象之间复杂的耦合关系,这一系列对象往往是“多对多”的耦合关系,《中介者模式》采用一个中介者对象将这一系列对象集中管理,而各个对象也将自己与其它对象的交互行为委托给中介者处理,从而减少这一系列对象之间的耦合。
它的优点倒是非常明显,清除了一系列对象之间复杂的耦合关系,并且中介者可以控制这一系列对象的行为,统一管理。
《中介者模式》的缺点是,由于中介者负责着一系列对象的交互与控制,所以中介者的类会非常复杂,而且一旦中介者类无法正常工作,那么所有将行为委托给中介者的类都将会出现问题,所以在使用的时候还是要特别小心。
