设计模式--观察者模式
Posted dxj1016
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式--观察者模式相关的知识,希望对你有一定的参考价值。
设计模式分为三种类型,共23种
- 创建型模式:单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式。
- 结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
- 行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)。
1、基本介绍
- 定义了对象之间的一对多依赖关系,这样一来,当一个对象改变状态时,他的所有依赖者都会收到通知并自动更新。
- 原则:为对象之间的松耦合设计而努力
2、模拟实例
观察者模式包含如下角色:
Subject: 主题
ConcreteSubject: 具体主题
Observer: 观察者
ConcreteObserver: 具体观察者
主题
package designpattern.observer.myobserver;
public interface Subject
public void add(Observer o);
public void remove(Observer o);
public void cry();
具体主题
package designpattern.observer.myobserver;
import java.util.ArrayList;
import java.util.List;
public class Cat implements Subject
public List<Observer> observers;
String value = null;
public Cat()
observers = new ArrayList<Observer>();
@Override
public void add(Observer o)
observers.add(o);
@Override
public void remove(Observer o)
observers.remove(o);
@Override
public void cry()
System.out.println(value);
for (Observer observer : observers)
observer.response();
public void setValue(String value)
this.value = value;
cry();
观察者
package designpattern.observer.myobserver;
public interface Observer
void response();
具体观察者
package designpattern.observer.myobserver;
//老鼠
public class Mouse implements Observer
String value;
Subject cat;
public Mouse(Cat cat)
this.cat = cat;
cat.add(this);
@Override
public void response( )
display();
public void display()
System.out.println("老鼠赶紧跑");
package designpattern.observer.myobserver;
//狗
public class Dog implements Observer
String value;
public Subject cat;
public Dog(Cat cat)
this.cat = cat;
cat.add(this);
@Override
public void response( )
display();
public void display()
System.out.println("狗跟着叫");
测试:
package designpattern.observer.myobserver;
public class Client
public static void main(String[] args)
Cat cat = new Cat();
Dog dog = new Dog(cat);
Mouse mouse = new Mouse(cat);
cat.setValue("我是猫,老鼠你快跑");
/*
我是猫,老鼠你快跑
狗跟着叫
老鼠赶紧跑
*/
3、练习
目标
import java.util.*;
public abstract class AllControlCenter
protected String allyname;
protected ArrayList<Observer> players=new ArrayList<Observer>();
public AllControlCenter(String allyname)
this.allyname=allyname;
public void add(Observer o)
players.add(o);
public void remove(Observer o)
players.remove(o);
public String getAllyname()
return allyname;
public void setAllyname(String allyname)
this.allyname = allyname;
public abstract void notify(String name);
具体目标
public class ControlCenter extends AllControlCenter
public ControlCenter(String allyname)
super(allyname);
public void notify(String name)
for (Object o:players)
if(!((Observer)o).getName().equalsIgnoreCase(name))
((Observer)o).help();
观察者
public abstract class Observer
protected String name;
public Observer(String name)
this.name=name;
public String getName()
return name;
public void setName(String name)
this.name = name;
public abstract void help();
public abstract void beattacted(AllControlCenter acc);
具体观察者
public class Player extends Observer
public Player(String name)
super(name);
public void help()
System.out.println("坚持住,"+this.name+"来救你!");
public void beattacted(AllControlCenter acc)
System.out.println(this.name+"被攻击");
acc.notify(this.name);
package designpattern.observer.test2;
public class Player1 extends Observer
public Player1(String name)
super(name);
public void help()
System.out.println("坚持住,"+this.name+"来救你!");
public void beattacted(AllControlCenter acc)
System.out.println(this.name+"被攻击");
acc.notify(this.name);
package designpattern.observer.test2;
public class Player2 extends Observer
public Player2(String name)
super(name);
public void help()
System.out.println("坚持住,"+this.name+"来救你!");
public void beattacted(AllControlCenter acc)
System.out.println(this.name+"被攻击");
acc.notify(this.name);
测试:
package designpattern.observer.test2;
public class Client
public static void main(String[] args)
ControlCenter aaa = new ControlCenter("aaa");
Player bbb = new Player("bbb");
Player1 ccc = new Player1("ccc");
Player2 ddd = new Player2("ddd");
aaa.add(bbb);
aaa.add(ccc);
aaa.add(ddd);
// bbb向所有人发送他被攻击的信息
bbb.beattacted(aaa);
// 名称为ccc的过来救助
// aaa.notify("ccc");
/*
bbb被攻击
坚持住,ccc来救你!
坚持住,ddd来救你!
*/
以上是关于设计模式--观察者模式的主要内容,如果未能解决你的问题,请参考以下文章