• 设计模式------观察者模式


    观察者模式:
    定义对象之间的一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都得到通知并被自动更新.

    观察者模式的四个角色:
    1.Subject(目标)
    2.ConcreteSubject(具体目标)
    3.Observer(观察者)
    4.ConcreteObserver(具体观察者)

    举例说明:
    多人联机对战中,一个队友遭受攻击将给其他的盟友发送通知.

    具体实现:

    /**
    *
    * @ClassName: ControlCenter
    * @Description: 指挥部,充当目标抽象类
    * @author haibiscuit
    * @date 2019年10月22日 下午6:02:49
    *
    */
    public abstract class ControlCenter {
    protected String name; //队伍名称
    protected List<Observer> list = new ArrayList<>();

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    //加入战队
    public void join(Observer observer) {
    list.add(observer);
    }
    //撤出战队
    public void quit(Observer observer) {
    list.remove(observer);
    }


    //抽象方法
    public abstract void notifyObserver(String name);
    }

    /**
    *
    * @ClassName: ConcreteControllCenter
    * @Description: 具体目标类
    * @author haibiscuit
    * @date 2019年10月22日 下午8:50:23
    *
    */
    public class ConcreteControllCenter extends ControlCenter{

    public ConcreteControllCenter(String name) {
    System.out.println("战队-"+name+"-创建成功!");
    this.name = name;
    }

    @Override
    public void notifyObserver(String name) {
    System.out.println(name+"遭受攻击!");
    for (Observer observer : list) {
    if(!((Player)observer).getName().equals(name)) {
    observer.help();
    }
    }
    }

    }

    /**
    *
    * @ClassName: Observer
    * @Description: 抽象观察者类
    * @author haibiscuit
    * @date 2019年10月22日 下午6:16:54
    *
    */
    public abstract class Observer {
    protected abstract void help();
    protected abstract void beAttacked(ControlCenter controlCenter);
    }

    /**
    *
    * @ClassName: Player
    * @Description: 具体观察者类
    * @author haibiscuit
    * @date 2019年10月22日 下午6:20:30
    *
    */
    public class Player extends Observer{
    private String name ;


    public Player(String name) {
    this.name = name;
    }
    @Override
    protected void help() {
    System.out.println(name+"来救你!");
    }

    @Override
    protected void beAttacked(ControlCenter controlCenter) {
    controlCenter.notifyObserver(name);
    }



    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    }

    /**
    *
    * @ClassName: ObserverTest
    * @Description: 观察者模式的测试类
    * @author haibiscuit
    * @date 2019年10月22日 下午8:51:05
    *
    */
    public class ObserverTest {
    public static void main(String args[]) {
    ControlCenter controlCenter = new ConcreteControllCenter("英雄战队!");
    Observer observer1,observer2,observer3,observer4;

    observer1 = new Player("猪队友1");
    observer2 = new Player("猪队友2");
    observer3 = new Player("猪队友3");
    observer4 = new Player("猪队友4");

    controlCenter.join(observer1);
    controlCenter.join(observer2);
    controlCenter.join(observer3);
    controlCenter.join(observer4);


    observer1.beAttacked(controlCenter);//一个队友被攻击,呼唤其他队友
    }

    总结:

        可以看到,观察者模式和中介者模式非常的相像,两者在原有代码的基础上稍微变动就可以相互转换,只是代码实现的

    方式不同.

      至于具体的使用场景肯定是完成组件与组件之间的通信了.

  • 相关阅读:
    "字符反向拼接"组件:<reverse> —— 快应用组件库H-UI
    "首字母变大写"组件:<capitalize> —— 快应用组件库H-UI
    "字母全变大写"组件:<uppercase> —— 快应用组件库H-UI
    "字母全变小写"组件:<lowercase> —— 快应用组件库H-UI
    "多行文本"组件:<multi> —— 快应用组件库H-UI
    "斜体显示"组件:<i> —— 快应用组件库H-UI
    捕捉AVPlayerViewController 系统原生工具栏的出现、隐藏事件
    (简单实用)Android支付宝商家收款语音播报
    使用wkwebview时,push后,再pop返回,报错
    安卓进度条两边圆角+渐变的拓展
  • 原文地址:https://www.cnblogs.com/haibiscuit/p/11722516.html
Copyright © 2020-2023  润新知