设计模式--观察者模式
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来救你!
*/
以上是关于设计模式--观察者模式的主要内容,如果未能解决你的问题,请参考以下文章
Java设计模式补充:回调模式事件监听器模式观察者模式(转)