美文网首页
对观察者模式的理解

对观察者模式的理解

作者: 抽筋的狗狗 | 来源:发表于2021-08-26 08:10 被阅读0次

一、作用

观察者模式的主要的作用就是对对象解耦,将观察者和被观察者完全隔离。 观察者模式解除了主题和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体。


二、在装饰器模式中的角色有:

  • AllyControlCenter:目标类(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。

  • ConcreteAllyControlCenter:具体目标类(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。

  • Observer:抽象观察者,是观察者者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。

  • Player:具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。


观察者模式uml

package designPattern.observer.test1;

import java.util.ArrayList;
import java.util.List;

//战队控制中心类:目标类
public abstract class AllyControlCenter {
    protected String allyName; // 战队名称
    protected List<Observer> players = new ArrayList<>();

    public String getAllyName() {
        return allyName;
    }

    public void setAllyName(String allyName) {
        this.allyName = allyName;
    }

    // 注册方法
    public void join(Observer ob) {
        System.out.println(ob.getName() + "加入" + this.allyName + "战队");
        players.add(ob);
    }

    // 注销方法
    public void quit(Observer ob) {
        System.out.println(ob.getName() + "退出" + this.allyName + "战队");
        players.remove(ob);
    }

    public abstract void notifyObserver(String name);
}


package designPattern.observer.test1;

//具体战队控制中心类:具体目标类
public class ConcreteAllyControlCenter extends AllyControlCenter {

    public ConcreteAllyControlCenter(String allyName) {
        System.out.println(allyName + "战队组建成功!");
        System.out.println("--------------------------------");
        this.allyName = allyName;
    }

    // 实现通知方法
    @Override
    public void notifyObserver(String name) {
        // TODO Auto-generated method stub
        System.out.println(this.allyName + "战队紧急通知,盟友" + name);
        // 遍历观察者集合,调用每一个盟友(自己除外)的支援方法
        for (Observer ob : players) {
            if (!ob.getName().equalsIgnoreCase(name)) {
                ob.help();
            }
        }
    }

}

package designPattern.observer.test1;

//抽象观察者
public interface Observer {
    public String getName();

    public void setName(String name);

    public void help(); // 声明支援盟友方法

    public void beAttacked(AllyControlCenter acc); // 声明遭受到攻击的方法
}

package designPattern.observer.test1;

public class Player implements Observer {
    private String name;

    public Player(String name) {
        // TODO Auto-generated constructor stub
        this.name = name;
    }

    @Override
    public String getName() {
        // TODO Auto-generated method stub
        return name;
    }

    @Override
    public void setName(String name) {
        // TODO Auto-generated method stub
        this.name = name;
    }

    @Override
    public void help() {
        // TODO Auto-generated method stub
        System.out.println("坚持住," + this.name + "来救你!");
    }

    @Override
    public void beAttacked(AllyControlCenter acc) {
        // TODO Auto-generated method stub
        System.out.println(this.name + "被攻击!");
        acc.notifyObserver(name);
    }

}

package designPattern.observer.test1;

public class Client {

    public static void main(String[] args) {
        // 定义观察目标
        AllyControlCenter acc = new ConcreteAllyControlCenter("金庸群侠");
        Observer ob1, ob2, ob3, ob4;
        ob1 = new Player("杨过");
        acc.join(ob1);

        ob2 = new Player("令狐冲");
        acc.join(ob2);
        ob3 = new Player("张无忌");
        acc.join(ob3);
        ob4 = new Player("段誉");
        acc.join(ob4);

        ob3.beAttacked(acc);

    }

}

相关文章

网友评论

      本文标题:对观察者模式的理解

      本文链接:https://www.haomeiwen.com/subject/gpxpiltx.html