利用java1.8的函数式接口实现事件委托,结果是可行的,我不确定效果是否一致,大家帮忙一起看下。
package com.designmodel.designmodel.demo;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class ObserverDemo {
@Test
public void test(){
Subject subject = new Boss();
/*Observer observer = new NbaObserver();
Observer touchFish = new TouchFishObserver();*/
NbaObserver nbaObserver = new NbaObserver(subject);
TouchFishObserver touchFishObserver = new TouchFishObserver(subject);
subject.status = "taleile";
List<UpdateInvoker> updateInvokerList = new ArrayList<>();
updateInvokerList.add(nbaObserver::closeVideo);
updateInvokerList.add(touchFishObserver::stopTouch);
subject.notifyObserver(updateInvokerList);
}
abstract class Subject {
protected String status;
/*abstract void addObserver(Observer observer);
abstract void removeObserver(Observer observer);*/
abstract void notifyObserver(List<UpdateInvoker> updateInvokerList);
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
class Boss extends Subject {
private List<Observer> observerList = new ArrayList<>();
/* @Override
void addObserver(Observer observer) {
observerList.add(observer);
}
@Override
void removeObserver(Observer observer) {
observerList.remove(observer);
}*/
@Override
void notifyObserver(List<UpdateInvoker> updateInvokerList) {
updateInvokerList.forEach(UpdateInvoker::update);
}
}
class Secretary extends Subject {
private List<Observer> observerList = new ArrayList<>();
/* @Override
void addObserver(Observer observer) {
observerList.add(observer);
}
@Override
void removeObserver(Observer observer) {
observerList.remove(observer);
}
*/
@Override
void notifyObserver(List<UpdateInvoker> updateInvokerList) {
updateInvokerList.forEach(UpdateInvoker::update);
}
}
abstract class Observer {
Subject subject;
public Observer(Subject subject) {
this.subject = subject;
}
}
class NbaObserver{
Subject subject;
public NbaObserver(Subject subject) {
this.subject = subject;
}
protected void closeVideo() {
System.out.println("关闭NBA直播!" + subject.status);
}
}
class TouchFishObserver{
Subject subject;
public TouchFishObserver(Subject subject) {
this.subject = subject;
}
protected void stopTouch() {
System.out.println("别摸了!" + subject.status);
}
}
@FunctionalInterface
interface UpdateInvoker {
void update();
}
}