观察者模式(Observer)(行为模式)

参考文档:

1.设计模式-可复用面向对象软件的基础

2.http://blog.csdn.net/zhshulin/article/details/38708351(设计模式——观察者模式(Observer) 


观察者模式(Observer)(行为模式) 

详细的理论方面的知识,可以参考  参考文档。

看一下observer的结构:


协作方式:


如果,在实现是,需要封装复杂的更新语义,可以使用Mediator(5.5)模式,ChangeManager是一个Mediator(5.5)模式的实例。


代码实现,案例为书中讲的时钟的案例。

Subject.java:
package com.rick.designpattern.observer;

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

/**
 * Created by MyPC on 2017/6/19.
 */
public abstract class Subject {
    private List<Observer> observers = new ArrayList<Observer>();

    public void attach(Observer observer) {
        observers.add(observer);
    }

    public void detach(Observer observer) {
        observers.remove(observer);
    }

    public void Notify() {
        for (Observer os : observers) {
            os.update(this);
        }
    }
}
ClockTimer.java:
package com.rick.designpattern.observer;

import javax.xml.crypto.Data;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created by MyPC on 2017/6/19.
 */
public class ClockTimer extends Subject {
    private int hour, minute, second;

    public ClockTimer() {
    }

    public int getHour() {
        return hour;
    }

    public int getMinute() {
        return minute;
    }

    public int getSecond() {
        return second;
    }

    public void tick() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    Date date = new Date(System.currentTimeMillis());
                    hour = date.getHours();
                    minute = date.getMinutes();
                    second = date.getSeconds();
                    ClockTimer.this.Notify();
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

            }
        }).run();
    }


}
Observer.java:
package com.rick.designpattern.observer;

/**
 * Created by MyPC on 2017/6/19.
 */
public abstract class Observer {
    public abstract void update(Subject subject);

}
AnalogClock.java:
package com.rick.designpattern.observer;


/**
 * Created by MyPC on 2017/6/19.
 */
public class AnalogClock extends Observer implements Widget {
    private ClockTimer subject;

    public AnalogClock(ClockTimer subject) {
        this.subject = subject;
        subject.attach(this);
    }

    public void detachSubject() {
        subject.detach(this);
    }

    @Override
    public void draw() {
        System.out.println("AnalogClock:当前时间:" + subject.getHour() + ":" + subject.getMinute() + ":" + subject.getSecond());
    }

    @Override
    public void update(Subject subject) {
        if (subject instanceof ClockTimer) {
            draw();
        }
    }
}
DigitalClock.java:
package com.rick.designpattern.observer;


/**
 * Created by MyPC on 2017/6/19.
 */
public class DigitalClock extends Observer implements Widget {
    private ClockTimer subject;

    public DigitalClock(ClockTimer subject) {
        this.subject = subject;
        subject.attach(this);
    }

    public void detachSubject() {
        subject.detach(this);
    }

    @Override
    public void draw() {
        System.out.println("DigitalClock:当前时间:" + subject.getHour() + ":" + subject.getMinute() + ":" + subject.getSecond());
    }

    @Override
    public void update(Subject subject) {
        if (subject instanceof ClockTimer) {
            draw();
        }
    }
}
Widget.java:
package com.rick.designpattern.observer;

/**
 * Created by MyPC on 2017/6/19.
 */
public interface Widget {


    public void draw();

}
Client.java:
package com.rick.designpattern.observer;

/**
 * Created by MyPC on 2017/6/19.
 */
public class Client {


    public static void main(String[] args) {
        ClockTimer clockTimer = new ClockTimer();
        DigitalClock digitalClock = new DigitalClock(clockTimer);
        AnalogClock analogClock = new AnalogClock(clockTimer);
        clockTimer.tick();
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值