对观察者模式的理解

2021-08-26  本文已影响0人  抽筋的狗狗

一、作用

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


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


观察者模式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);

    }

}

上一篇 下一篇

猜你喜欢

热点阅读