中介者
    中介者模式:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。

    1. //创建门派抽象类
    2. package com.md.tertium;
    3. //门派抽象类
    4. public abstract class School {
    5. protected IPatternAlliance patternAlliance;
    6. public School(IPatternAlliance patternAlliance) {
    7. super();
    8. this.patternAlliance = patternAlliance;
    9. }
    10. //防御
    11. public void defense() {
    12. System.out.println( getName() + "防御" );
    13. }
    14. //攻击
    15. public void attack(School school) {
    16. System.out.println( getName() + "攻击" + school.getName() );
    17. }
    18. //有了中介者,将由中介者处理
    19. public void attackByPatternAlliance(School school) {
    20. patternAlliance.resolveAttack( this, school );
    21. }
    22. //门派攻击
    23. public void defenseByPatternAlliance() {
    24. patternAlliance.attack( this );
    25. }
    26. public abstract String getName();
    27. }
    28. package com.md.tertium;
    29. //中介者
    30. public class MediatorSchool extends School {
    31. public MediatorSchool(IPatternAlliance patternAlliance) {
    32. super( patternAlliance );
    33. }
    34. @Override
    35. public String getName() {
    36. return "中介者神阁";
    37. }
    38. }
    39. package com.md.tertium;
    40. public class CommandSchool extends School {
    41. public CommandSchool(IPatternAlliance patternAlliance) {
    42. super( patternAlliance );
    43. }
    44. @Override
    45. public String getName() {
    46. return "命令门";
    47. }
    48. }
    49. package com.md.tertium;
    50. public class SingletonSchool extends School {
    51. public SingletonSchool(IPatternAlliance patternAlliance) {
    52. super( patternAlliance );
    53. }
    54. @Override
    55. public String getName() {
    56. return "单例宗";
    57. }
    58. }
    59. package com.md.tertium;
    60. public class StrategySchool extends School {
    61. public StrategySchool(IPatternAlliance patternAlliance) {
    62. super( patternAlliance );
    63. }
    64. @Override
    65. public String getName() {
    66. return "策略";
    67. }
    68. }
    69. package com.md.tertium;
    70. import java.util.List;
    71. //模式联盟 中介者接口
    72. public interface IPatternAlliance {
    73. //提供一个加入联盟的接口
    74. public abstract void add(School school);
    75. //防御联盟
    76. public abstract void resolveAttack(School activeSide, School passiveSide);
    77. //攻击联盟
    78. public abstract void attack(School passiveSide);
    79. }
    80. package com.md.tertium;
    81. import java.util.LinkedList;
    82. import java.util.List;
    83. //联盟模式的具体实现
    84. public class PatternAlliance implements IPatternAlliance {
    85. private List <School> schoolList = new LinkedList <School>();
    86. @Override
    87. public void add(School school) {
    88. //加入联盟
    89. schoolList.add( school );
    90. }
    91. @Override
    92. public void resolveAttack(School activeSide, School passiveSide) {
    93. if (schoolList.contains( passiveSide )) {
    94. System.out.println( "被攻方" + passiveSide.getName() + "已加入联盟,联盟将齐力防御!" );
    95. for (School school : schoolList) {
    96. school.defense();
    97. }
    98. } else {
    99. System.out.println( "被攻方" + passiveSide.getName() + "未加入联盟,联盟不给予防御帮助!" );
    100. passiveSide.defense();
    101. }
    102. }
    103. @Override
    104. public void attack(School passiveSide) {
    105. if (schoolList.contains( passiveSide ) && schoolList.contains( passiveSide )) {
    106. System.out.println( "主攻方" + passiveSide.getName() + "以及被攻方" + passiveSide.getName() + "都已加入联盟,不允许内讧!" );
    107. } else if (schoolList.contains( passiveSide ) && !schoolList.contains( passiveSide )) {
    108. System.out.println( "主攻方" + passiveSide.getName() + "已加入联盟,被攻方" + passiveSide.getName() + "不在联盟之中,将集体攻打该门派!" );
    109. for (School school : schoolList) {
    110. school.attack( passiveSide );
    111. }
    112. } else {
    113. System.out.println( "主攻方" + passiveSide.getName() + "未加入联盟,联盟无权干预此事!" );
    114. passiveSide.attack( passiveSide );
    115. }
    116. }
    117. }
    118. package com.md.tertium;
    119. public class Main {
    120. public static void main(String[] args) {
    121. // School singletonSchool = new SingletonSchool();
    122. // School commandSchool = new CommandSchool();
    123. // School mediatorSchool = new MediatorSchool();
    124. //
    125. // singletonSchool.attack( mediatorSchool );
    126. // commandSchool.attack( mediatorSchool );
    127. //
    128. // mediatorSchool.defense();
    129. IPatternAlliance patternAlliance = new PatternAlliance();
    130. School singletonSchool = new SingletonSchool( patternAlliance );
    131. School commandSchool = new CommandSchool( patternAlliance );
    132. School mediatorSchool = new MediatorSchool( patternAlliance );
    133. School strategySchool = new StrategySchool( patternAlliance );
    134. //策略宫没有被联盟收留
    135. patternAlliance.add( mediatorSchool );
    136. patternAlliance.add( commandSchool );
    137. patternAlliance.add( singletonSchool );
    138. singletonSchool.attackByPatternAlliance( mediatorSchool );
    139. commandSchool.attackByPatternAlliance( mediatorSchool );
    140. System.out.println( "------------------------------------------------------" );
    141. mediatorSchool.attackByPatternAlliance( strategySchool );
    142. System.out.println( "------------------------------------------------------" );
    143. strategySchool.attackByPatternAlliance( mediatorSchool );
    144. mediatorSchool.defenseByPatternAlliance();
    145. System.out.println( "------------------------------------------------------" );
    146. }
    147. }

    《中介者模式》针对的问题是,解决一系列对象之间复杂的耦合关系,这一系列对象往往是“多对多”的耦合关系,《中介者模式》采用一个中介者对象将这一系列对象集中管理,而各个对象也将自己与其它对象的交互行为委托给中介者处理,从而减少这一系列对象之间的耦合。
    它的优点倒是非常明显,清除了一系列对象之间复杂的耦合关系,并且中介者可以控制这一系列对象的行为,统一管理。
    《中介者模式》的缺点是,由于中介者负责着一系列对象的交互与控制,所以中介者的类会非常复杂,而且一旦中介者类无法正常工作,那么所有将行为委托给中介者的类都将会出现问题,所以在使用的时候还是要特别小心。