观察者模式(行为型)

来源:互联网 发布:淘宝助理搬家 编辑:程序博客网 时间:2024/06/06 10:59

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

观察者模式有以下的4个角色:

1.抽象主题:又称为被观察者,可以增加和删除观察者对象;

2.抽象观察者:为所有具体的观察者都定义了一个共同的接口,在具体主题内部状态改变的时候,为所有的观察者发出通知。

3.具体主题

4.具体观察者

下面是观察者模式的UML图例:

下面模拟一个点击按钮的例子:

首先是两个抽象接口:

public interface Clickable {void Click();void addClickableObserver(ClickableObserver observer);void removeClickableOberver(ClickableObserver observer);}

public interface ClickableObserver {void click(Clickable clickable);}

下面是具体的主题和具体的观察者:

import java.util.ArrayList;import java.util.List;public class Button implements Clickable{List<ClickableObserver> observers=new ArrayList<ClickableObserver>();int x,y;public String Color;public void Click() {// TODO Auto-generated method stubSystem.out.println("按钮被单击!");for(int i=observers.size()-1;i>=0;i--){observers.get(i).click(this);}}public void addClickableObserver(ClickableObserver observer) {// TODO Auto-generated method stubobservers.add(observer);}public void removeClickableOberver(ClickableObserver observer) {// TODO Auto-generated method stubobservers.remove(observer);}@Overridepublic String toString() {return "Button [Color=" + Color + ", x=" + x + ", y=" + y + "]";}}

具体的观察者有3个:

public class ChangeColorObserver implements ClickableObserver {public void click(Clickable clickable) {// TODO Auto-generated method stubButton b=(Button) clickable;b.Color="红色";}}

public class ChangeCoordinateObserver implements ClickableObserver{public void click(Clickable clickable) {// TODO Auto-generated method stubButton b=(Button) clickable;b.x=100;b.y=90;}}

public class OtherObserver implements ClickableObserver {public void click(Clickable clickable) {// TODO Auto-generated method stubSystem.out.println("执行其他的操作");}}
最后给出主程序:

public class Main {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubButton button=new Button();button.Color="白色";button.x=0;button.y=0;button.addClickableObserver(new ChangeColorObserver());button.addClickableObserver(new ChangeCoordinateObserver());button.addClickableObserver(new OtherObserver());button.Click();//模拟一次按钮点击System.out.println(button);}}


0 0