无废话设计模式(15)行为型模式--观察者模式

0-前言

  观察者模式定义:定义了一种一对多的依赖关系让多个观察者对象同事监听某一主题对象。

          这个主题对象在状态发生改变时,会通知所有观察者对象,使他们能够自动更新自己;

1-实现

1-1、简单UML图:

1-2、代码实现

//1、Sujcet抽象父类(通知者父类)
abstract class ManSubject
{
    private List<ManObserver> observers = new ArrayList(); //观察者列表
    public String  MyName; //名字

    private String StateMessage; //要通知的消息

    public ManSubject()
    {
    }

    //A、加入观察者
    public void Attach(ManObserver _Observer)
    {
        observers.add(_Observer);
    }
    //B、通知
    public  void NotifyAll()
    {
        for (ManObserver item : observers)
        {
            item.Update();
        }
    }
    //C、设置要通知的消息
    public String getStateMessage()
    {
        return StateMessage;
    }

    public void setStateMessage(String stateMessage)
    {
        StateMessage = stateMessage;
    }

}
//1-1、具体通知者
class ManSubjectA extends ManSubject
{
    public ManSubjectA()
    {
        this.MyName = "三弟(通知者)";
    }
}

//----------------------------------------------------
//2、观察者父类
abstract class ManObserver
{
    public  String MyName;
    public ManSubject subject;

    public ManObserver(String _name,ManSubject _subject)
    {
        this.MyName = _name;
        this.subject = _subject;
    }

    //收到通知后更新自己
    public  abstract  void Update();
}
//2-1、具体观察者A
class  ManObserverA extends ManObserver
{
    public ManObserverA(String _name,ManSubject _subject)
    {
        super(_name, _subject);
    }

    @Override
    public void Update()
    {
        System.out.println("---------------收到【"+subject.MyName+"】的消息【"+subject.getStateMessage()+"】");
        System.out.println(MyName + "赶紧关闭了动画片去干活");
    }
}
//2-2、具体观察者B
class  ManObserverB extends ManObserver
{
    public ManObserverB(String _name,ManSubject _subject)
    {
        super(_name, _subject);
    }

    @Override
    public void Update()
    {
        System.out.println("---------------收到【"+subject.MyName+"】的消息【"+subject.getStateMessage()+"】");
        System.out.println(MyName + "赶紧放下手机游戏去干活");
    }
}

客户端

//通知者
        ManSubject manSubject = new ManSubjectA();

        //观察者
        ManObserver manObserverA = new ManObserverA("大姐",manSubject);
        ManObserver manObserverB = new ManObserverB("二哥",manSubject);

        //将观察者加入通知者中
        manSubject.Attach(manObserverA);
        manSubject.Attach(manObserverB);

        //发布通知,通知各观察者
        manSubject.setStateMessage("老爸拖着大棍子回来了");
        manSubject.NotifyAll();

运行结果

2-应用场景简单总结

1、当一个模型的一方面必须依赖另一方面时;

2、当一个对象的改变需要同事改变多个对象时;

3、当一个对象必须通知其他对象,但又不能紧耦合时;

(0)

相关推荐

  • 设计模式中的观察者模式

    观察者模式是一种软件设计模式,其中一个名为主体(Subject)的对象维护其依赖项列表,称为观察者,并通常通过调用它们(observers)的方法之一来自动通知它们任何状态更改. 观察者模式主要用于在 ...

  • 设计模式之观察者模式(三)

    又和大家见面了.首先,和大家说声抱歉,之前的几篇文章,可能条理清晰之类的做的不太好,每篇文章的篇幅也比较长,小编在收到读者的建议之后, 也是认真的思考了一番.之前的想法是尽量把一个模块介绍完,没想到一 ...

  • 行为型模式之观察者模式

    在现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变.例如,某种商品的物价上涨时会导致部分商家高兴,而消费者伤心. 在软件世界也是这样,例如 ...

  • 设计模式(20) 观察者模式

    观察者模式是一种平时接触较多的模式.它主要用于一对多的通知发布机制,当一个对象发生改变时自动通知其他对象,其他对象便做出相应的反应,同时保证了被观察对象与观察对象之间没有直接的依赖. GOF对观察者模 ...

  • Java中的设计模式(一):观察者模式

    工具与资源中心 帮助开发者更加高效的工作,提供围绕开发者全生命周期的工具与资源https://developer.aliyun.com/tool?spm=a1z389.11499242.0.0.654 ...

  • PHP设计模式—观察者模式

    定义: 观察者模式(Observer):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 结构: Eve ...

  • 无废话设计模式(17)行为型模式--中介者模式

    0-前言 中介者模式定义(Mediator): 用一个中介对象来封装一系列的对象交互. 中介者对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互. 1-实现 1-1.简单UM ...

  • 无废话设计模式(16)行为型模式--备忘录模式

    0-前言 备忘录模式定义:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态. 这样以后就可以将该对象恢复到原先保存的状态. 1-实现 备忘录模式设计的初衷是用于备份状态. 但是 ...

  • 无废话设计模式(12)行为型模式--模板方法模式

    0-前言 模板方法模式定义:定义一个操作中的算法骨架,而将一些步骤延迟到子类中: 模板方法模式使得子类可以不改变一个算法的结构即可重新定义该算法的某些步骤: 1-实现 1-1.简单UML图:  1-2 ...

  • 无废话设计模式(11)结构型模式--代理模式

    0-前言 代理模式定义:为其他对象提供一种代理以控制对这个对象的访问. 1-实现 1-1.简单UML图: 1-2.代码实现 //1.抽象父类 abstract class Actor { public ...

  • 无废话设计模式(10)结构型模式--外观模式

    0-前言 外观模式定义:为子系统中的一组接口提供一个一致的界面,此模式定了一个高层接口    这一接口使得这一子系统更加容易使用: 1-实现 1-1.简单UML图: 1-2.代码实现 //1.子系统A ...

  • 无废话设计模式(9)结构型模式--享元模式

    0-前言 享元模式定义:运用共享技术有效地支持大量细粒度的对象. 1-实现 1-1.简单UML图:  1-2.代码实现 //1.抽象父类(网站父类) abstract class Website { ...

  • 无废话设计模式(1)--简单工厂、工厂方法、抽象工厂

    0-前言 简单工厂.工厂方法.抽象工厂都是创建型的设计模式,三个设计模式都是工厂的变种,不复杂,下面我们来快速学习这三种: 1-简单工厂模式 太简单,UML图就不画了,直接上代码: //------- ...

  • 茶跟酒一样分浓香、醇香?这15种茶型你喝全了吗?

    酒分浓香.酱香,是酿造工艺的不同造就了口感的差别,而影响茶叶滋味的差异因素主要是鲜叶和加工工艺. 鲜叶是物质基础,直接或间接地影响着茶叶的滋味,茶叶中涩味物质的不同造成了茶滋味甘爽度的不同. 另一个影 ...