某在线游戏支持多人联机对战,每个玩家都可以加人某一战队组成联盟,当战队巾某一成员受到敌人攻击时将给所有盟友发送通知,盟友收到通知后将做出响应。使用观发者模式和中介者模式设计并实现该过程。

类图:
在这里插入图片描述

代码:

import java.util.ArrayList;

public class Pro {
	public static void main(String[] args) {
		Observer player1, player2, player3, player4;
		player1 = new Player("jack");
		player2 = new Player("Mick");
		player3 = new Player("kity");
		player4 = new Player("jim");

		Allay allay = new ConcreteAlly("The Best");
		allay.join(player1);
		allay.join(player2);
		allay.join(player3);

		player2.beAttacked();
		player4.beAttacked();
		allay.quit(player1);
		player3.beAttacked();
	}
}

abstract class Allay {
	protected String name;
	protected ArrayList<Observer> membersArrayList = new ArrayList<Observer>();

	public void join(Observer obs) {
		System.out.println(obs.getName() + "加入" + this.name + "联盟");
		membersArrayList.add(obs);
		obs.setAllay(this);
	}

	public void quit(Observer obs) {
		System.out.println(obs.getName() + "退出" + this.name + "联盟");
		membersArrayList.remove(obs);
		obs.setAllay(null);
	}

	public abstract void notifyMembers(String name);
}

class ConcreteAlly extends Allay {
	public ConcreteAlly(String name) {
		this.name = name;
	}

	@Override
	public void notifyMembers(String name) {
		System.out.println(this.name + "联盟中成员" + name + "遭受敌人攻击!");
		for (Observer observer : membersArrayList) {
			if (!observer.name.equals(name)) // 自己不能帮自己
				observer.help(name);
		}
	}

}

abstract class Observer {

	protected String name;
	protected Allay allay;

	public Allay getAllay() {
		return allay;
	}

	public void setAllay(Allay allay) {
		this.allay = allay;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public abstract void beAttacked();

	public abstract void help(String name);
}

class Player extends Observer {
	public Player(String name) {
		this.name = name;
	}

	@Override
	public void beAttacked() {
		System.out.println(name + "遭受敌人攻击");
		if (allay != null) {
			allay.notifyMembers(name);
		} else {
			System.out.println(name + "没有联盟,没人帮你");
		}
	}

	@Override
	public void help(String name) {
		System.out.println(this.name + "来救" + name);
	}

}

运行结果:
在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐