设计模式--观察者模式

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来救你!
 */

以上是关于设计模式--观察者模式的主要内容,如果未能解决你的问题,请参考以下文章

深入浅出设计模式之策略模式观察者模式

观察者模式

四观察者模式

观察者模式行为模式

设计模式--观察者模式

设计模式——观察者模式