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);//一个队友被攻击,呼唤其他队友
    }

    总结:

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

    方式不同.

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

  • 相关阅读:
    JS原型链与instanceof底层原理
    流程关系图制作---ProcessOn从入门到精通
    VBA比较两个Excel数据的异同
    C# 通过 Quartz .NET 实现 schedule job 的处理
    C# 通过 Quartz .NET 实现Timer Job并将其注册成为Windows Service
    在.Net Framework中调用Python的脚本方法 (以VB和C#为例)
    用Python建立连接直接读取与更改Rockwell Control Logix Controller的tag值
    C#通过第三方组件生成二维码(QR Code)和条形码(Bar Code)
    如何根据条件来确定某个字段是否应该被序列化
    在Asp.Net MVC 中如何用JS访问Web.Config中appSettings的值
  • 原文地址:https://www.cnblogs.com/haibiscuit/p/11722516.html
Copyright © 2011-2022 走看看