【设计模式】(二十五)–行为型模式–中介者模式
中介者模式定义
Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly. and it lets you vary their interaction independently.
意思是:用一个中介对象封装一系列对象的交互,中介者使各对象不需要显示的相互作用,从而使其松散耦合,而且可以独立地改变它们之间的交互。
中介者模式一般有4个元素:
- Mediator 抽象中介者,定义了同事对象到中介者对象的统一接口,用于各个同事角色之间的通信。
- Concrete Mediator 具体中介者,实现了中介者声明的操作,依赖于各个同事角色,并通过协调各个同事实现协作行为。
- Colleague 抽象同事,定义了中介者到同事对象的接口,同事对象只知道中介者而不知道其余同事对象。
- Concrete Colleague 具体同事,实现了同事接口的具体类,每一个具体同事类都清楚自己范围内的行为,但是不清楚扩大范围后的目的。
中介者模式的优点
- 1、降低了类的复杂度,将一对多转化成了一对一。
- 2、各个类之间的解耦,各个同事类只依赖于中介者,使得同事类更容易复用,中介者类和同事类都可以相对独立的演化。
- 3、符合迪米特原则。
中介者模式虽然降低了同事对象的复杂性,但是中介者类还要处理协调事务大大的增加了终结者类的复杂性,中介者类不注意很容易膨胀到难以维护。所以要注意一下情况:
- 不应当在责任划分混乱时使用。尤其是在系统设计之初,需求不大确定时,直接引入中介者,责任划分的不清,很可能会导致对象之间关系混乱,系统难以维护。
- 合理的使用封装,不应当对数据类和方法类使用。
中介者模式的使用场景
- 1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
- 2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
中介者模式的简单实现
类图
实现
public class Test {
public static void main(String[] args) {
BeiWaiHeros beiWaiHeros = new BeiWaiHerosImpl();
User user = new Gamer("大少", "射手", beiWaiHeros);
User user1 = new Gamer("大少小号1", "坦克", beiWaiHeros);
User user2 = new Gamer("大少小号2", "法师", beiWaiHeros);
User user3 = new Gamer("二少", "战士", beiWaiHeros);
User user4 = new Gamer("二少小号1", "辅助", beiWaiHeros);
user.willPlay();
user1.willPlay();
user2.willPlay();
user3.willPlay();
user4.willPlay();
User user5 = new Gamer("三少", "刺客", beiWaiHeros);
User user6 = new Gamer("三少", "法师", beiWaiHeros);
}
}
public interface BeiWaiHeros {
void login(User user);
void match(User user);
}
public class BeiWaiHerosImpl implements BeiWaiHeros {
List<User> onlineUser = new ArrayList<>();
List<User> matchingUser = new ArrayList<>();
int playingCount = 0;
private final int COUNT = 4;
private final String RED = "红色方";
private final String BLUE = "蓝色方";
@Override
public void login(User user) {
onlineUser.add(user);
System.out.println("登录成功,在线人数:" + onlineUser.size() + "," + playingCount + "玩家正在游戏中!");
}
@Override
public void match(User user) {
matchingUser.add(user);
if (COUNT == matchingUser.size()) {
playingCount = playingCount + COUNT;
System.out.println("游戏匹配成功!游戏开始");
matchingUser.clear();
return;
}
int estimateTime = (COUNT - matchingUser.size()) * 2;
System.out.println("正在匹配人数" + matchingUser.size() + "玩家" + user.getName() + ",预计需要等待" + estimateTime + "秒!");
}
}
public abstract class User {
private String name;
private String commonlyHero;
BeiWaiHeros beiWaiHeros;
private String camp;
public User(String name, String commonlyHero, BeiWaiHeros beiWaiHeros) {
this.name = name;
this.commonlyHero = commonlyHero;
this.beiWaiHeros = beiWaiHeros;
beiWaiHeros.login(this);
}
public void setCamp(String camp) {
this.camp = camp;
}
public void willPlay() {
beiWaiHeros.match(this);
}
public String getName() {
return name;
}
}
public class Gamer extends User {
public Gamer(String name, String commonlyHero, BeiWaiHeros beiWaiHeros) {
super(name, commonlyHero, beiWaiHeros);
}
}
结果
实现说明,通过一个BeiWaiHeros游戏,BeiWaiHeros游戏是一个2v2的pvp游戏,实现中介者模式。