标签:
总体来说设计模式分为三大类:
创建型模式5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
Demo:本次以常用的推模型为案例
public interface Subject {//主题接口
public void register(Observer obj);//注册
public void unregister(Observer obj);//注销
public void notifyObservers();//通知观察者
public Object getUpdate(Observer obj);//更新
}
public interface Observer {//观察者接口
public void update();//该方法能够根据主题的变化通知进行更新
public void setSubject(Subject sub);//将被绑定到主题对象中,使主题附属于一个观察者
}
public class MyTopic implements Subject {//主题的具体实现类
private List<Observer> observers;
private String message;
private boolean changed;//用于追踪主题状态的变化并且通知观察者此种变化。
private final Object MUTEX= new Object();//互斥体对象,此处仅用于同步加锁
public MyTopic(){
this.observers=new ArrayList<>();
}
@Override
public void register(Observer obj) {
if(obj == null) throw new NullPointerException("Null Observer");
if(!observers.contains(obj)) observers.add(obj);
}
@Override
public void unregister(Observer obj) {
observers.remove(obj);
}
@Override
public void notifyObservers() {
List<Observer> observersLocal = null;
synchronized (MUTEX) {//此处加同步锁,是确保在消息被发布给主题之前,通知只能被发送到注册的观察者处。
if (!changed)
return;
observersLocal = new ArrayList<>(this.observers);
this.changed=false;
}
for (Observer obj : observersLocal) {
obj.update();
}
}
@Override
public Object getUpdate(Observer obj) {
return this.message;
}
public void postMessage(String msg){//消息推送
System.out.println("收到新消息啦");
this.message=msg;
this.changed=true;
notifyObservers();
}
}
public class MyTopicSubscriber implements Observer {//观察者类的实现
private String name;
private Subject topic;
public MyTopicSubscriber(String nm){
this.name=nm;
}
@Override
public void update() {//此处避免把消息作为参数传递给update()方法
String msg = (String) topic.getUpdate(this);//使用了被观察者的getUpdate()来处理更新的消息
if(msg == null){
System.out.println(name+":没有新消息");
}else
System.out.println(name+":新消息:"+msg);
}
@Override
public void setSubject(Subject sub) {
this.topic=sub;
}
}
public class ObserverPatternTest {
public static void main(String[] args) {
MyTopic topic = new MyTopic();
Observer obj1 = new MyTopicSubscriber("Obj1");
Observer obj2 = new MyTopicSubscriber("Obj2");
Observer obj3 = new MyTopicSubscriber("Obj3");
topic.register(obj1);
topic.register(obj2);
topic.register(obj3);
obj1.setSubject(topic);
obj2.setSubject(topic);
obj3.setSubject(topic);
obj1.update();
topic.postMessage("各位童鞋请注意");
}
}
Obj1 :没有新消息
收到新消息啦
Obj1 :新消息:各位童鞋请注意
Obj2 :新消息:各位童鞋请注意
Obj3 :新消息:各位童鞋请注意
标签:
原文地址:http://blog.csdn.net/sulikali/article/details/51331610