1、观察者接口类
package com.zawl.designpattern.observer;
/**
* @Description 观察者接口
* @Author Andy <luomuqintian@163.com>
* @Version V1.0.0
* @Since 1.0
* @Date 2019/12/1 12:05
*/
public interface Observer {
void update();
}
2、被观察者接口类
package com.zawl.designpattern.observer;
import java.util.ArrayList;
/**
* @Description 被观察者接口类
* @Author Andy <luomuqintian@163.com>
* @Version V1.0.0
* @Since 1.0
* @Date 2019/12/1 12:06
*/
public abstract class Subject {
//观察目标名称
private String name;
//观察目标状态
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//定义一个观察者集合用于存储所有观察者对象
protected ArrayList<Observer> observers = new ArrayList<>();
//注册方法,用于向观察者集合中增加一个观察者
public void attach(Observer observer) {
observers.add(observer);
}
//注销方法,用于在观察者集合中删除一个观察者
public void detach(Observer observer) {
observers.remove(observer);
}
//声明抽象通知方法
public abstract void notifyObserver();
}
3、被观察者具体实现类
package com.zawl.designpattern.observer;
/**
* @Description 被观察者具体实现类
* @Author Andy <luomuqintian@163.com>
* @Version V1.0.0
* @Since 1.0
* @Date 2019/12/1 12:10
*/
public class Enemy extends Subject{
@Override
public void notifyObserver() {
for(Observer observer:observers){
observer.update();
}
}
}
4、观察者具体实现类
package com.zawl.designpattern.observer;
/**
* @Description 观察者具体实现类
* @Author Andy <luomuqintian@163.com>
* @Version V1.0.0
* @Since 1.0
* @Date 2019/12/1 12:08
*/
public class Hero implements Observer{
private String name;
private String uniqueSkill;
public Hero(String name, String uniqueSkill) {
this.name = name;
this.uniqueSkill = uniqueSkill;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUniqueSkill() {
return uniqueSkill;
}
public void setUniqueSkill(String uniqueSkill) {
this.uniqueSkill = uniqueSkill;
}
@Override
public void update() {
System.out.println(this.name+"发现了敌军");
this.lastBlow();
}
/**
* 英雄发出最后一击
*/
public void lastBlow(){
System.out.println(this.name+"发起了"+uniqueSkill);
}
}
5、客户端
package com.zawl.designpattern.observer;
import java.util.ArrayList;
/**
* @Description
* @Author Andy <luomuqintian@163.com>
* @Version V1.0.0
* @Since 1.0
* @Date 2019/12/1 12:38
*/
public class Client {
public static void main(String[] args) {
Observer sf = new Hero("影魔","魂之挽歌");
Observer zeus = new Hero("宙斯","雷神之怒");
Observer th = new Hero("潮汐猎人","毁灭");
ArrayList<Observer> observers = new ArrayList<Observer>();
observers.add(sf);
observers.add(zeus);
observers.add(th);
Subject sub = new Enemy();
sub.setName("卡尔");
System.out.println("@"+sub.getName()+"遭受攻击");
sub.setState("残血");
System.out.println("@"+sub.getName()+"变成了"+sub.getState());
System.out.println("@天灾军团发现敌军--"+sub.getState()+sub.getName());
sub.observers = observers;
sub.notifyObserver();
sub.setState("被击杀");
System.out.println("@"+sub.getName()+sub.getState());
}
}
6、执行结果