设计模式--观察者模式

Posted dxj1016

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式--观察者模式相关的知识,希望对你有一定的参考价值。

设计模式分为三种类型,共23种

  1. 创建型模式:单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式。
  2. 结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
  3. 行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)。

1、基本介绍

  1. 定义了对象之间的一对多依赖关系,这样一来,当一个对象改变状态时,他的所有依赖者都会收到通知并自动更新。
  2. 原则:为对象之间的松耦合设计而努力

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设计模式补充:回调模式事件监听器模式观察者模式(转)

设计模式观察者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

观察者模式

未调用 LiveData 观察者

设计模式之美(c++)-笔记-56-观察者模式

设计模式之美(c++)-笔记-56-观察者模式