zoukankan      html  css  js  c++  java
  • 设计模式------观察者模式

    观察者模式:
    定义对象之间的一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都得到通知并被自动更新.

    观察者模式的四个角色:
    1.Subject(目标)
    2.ConcreteSubject(具体目标)
    3.Observer(观察者)
    4.ConcreteObserver(具体观察者)

    举例说明:
    多人联机对战中,一个队友遭受攻击将给其他的盟友发送通知.

    具体实现:

    /**
    *
    * @ClassName: ControlCenter
    * @Description: 指挥部,充当目标抽象类
    * @author haibiscuit
    * @date 2019年10月22日 下午6:02:49
    *
    */
    public abstract class ControlCenter {
    protected String name; //队伍名称
    protected List<Observer> list = new ArrayList<>();

    public String getName() {
    return name;
    }

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

    //加入战队
    public void join(Observer observer) {
    list.add(observer);
    }
    //撤出战队
    public void quit(Observer observer) {
    list.remove(observer);
    }


    //抽象方法
    public abstract void notifyObserver(String name);
    }

    /**
    *
    * @ClassName: ConcreteControllCenter
    * @Description: 具体目标类
    * @author haibiscuit
    * @date 2019年10月22日 下午8:50:23
    *
    */
    public class ConcreteControllCenter extends ControlCenter{

    public ConcreteControllCenter(String name) {
    System.out.println("战队-"+name+"-创建成功!");
    this.name = name;
    }

    @Override
    public void notifyObserver(String name) {
    System.out.println(name+"遭受攻击!");
    for (Observer observer : list) {
    if(!((Player)observer).getName().equals(name)) {
    observer.help();
    }
    }
    }

    }

    /**
    *
    * @ClassName: Observer
    * @Description: 抽象观察者类
    * @author haibiscuit
    * @date 2019年10月22日 下午6:16:54
    *
    */
    public abstract class Observer {
    protected abstract void help();
    protected abstract void beAttacked(ControlCenter controlCenter);
    }

    /**
    *
    * @ClassName: Player
    * @Description: 具体观察者类
    * @author haibiscuit
    * @date 2019年10月22日 下午6:20:30
    *
    */
    public class Player extends Observer{
    private String name ;


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

    @Override
    protected void beAttacked(ControlCenter controlCenter) {
    controlCenter.notifyObserver(name);
    }



    public String getName() {
    return name;
    }

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

    }

    /**
    *
    * @ClassName: ObserverTest
    * @Description: 观察者模式的测试类
    * @author haibiscuit
    * @date 2019年10月22日 下午8:51:05
    *
    */
    public class ObserverTest {
    public static void main(String args[]) {
    ControlCenter controlCenter = new ConcreteControllCenter("英雄战队!");
    Observer observer1,observer2,observer3,observer4;

    observer1 = new Player("猪队友1");
    observer2 = new Player("猪队友2");
    observer3 = new Player("猪队友3");
    observer4 = new Player("猪队友4");

    controlCenter.join(observer1);
    controlCenter.join(observer2);
    controlCenter.join(observer3);
    controlCenter.join(observer4);


    observer1.beAttacked(controlCenter);//一个队友被攻击,呼唤其他队友
    }

    总结:

        可以看到,观察者模式和中介者模式非常的相像,两者在原有代码的基础上稍微变动就可以相互转换,只是代码实现的

    方式不同.

      至于具体的使用场景肯定是完成组件与组件之间的通信了.

  • 相关阅读:
    C​S​S3​:​transition与visibility
    CSS ::before 和 ::after 伪元素 进阶
    [转]达梦数据库报错:不能同时包含聚集KEY和大字段(text类型)
    [转].netcore webapi post参数长度超过最大限制
    efcore执行sql查询(无需定义dbset<model>)
    Rabbitmq的死信
    用Docker搭建RabbitMq的普通集群和镜像集群
    .NetCore在IdentityServer4因为Cookies的SameSite导致授权登录跳转回登录页的问题
    2021>2022
    js 宽高相关及其应用
  • 原文地址:https://www.cnblogs.com/haibiscuit/p/11722516.html
Copyright © 2011-2022 走看看