设计模式篇—— 观察者模式

 

public abstract class AllayControlCenter { 

    public String allayName;   

    public List<Observer> ObsList = new ArrayList<>();

    public String getAllayName() {

        return allayName;

    }

    public void setAllayName(String allayName) {

        this.allayName = allayName;

    }

    public void join(Observer obs) {

        System.out.println(obs.getName() + "加入" + this.getAllayName() +"战队");

        ObsList.add(obs);

    }

    public void quit(Observer obs) {

        System.out.println(obs.getName() + "退出" + this.getAllayName() +"战队");

        ObsList.remove(obs);

    }

    public abstract void notifyObserver(String name) ;

}

 

public interface Observer {

    public String getName();   

    public void setName(String name);  

    public void beAttacked(AllayControlCenter acc); //收到攻击给指挥中心发送求救信息

    public void help();//接受指挥中心的求救信息   

}

 

public class Player implements Observer{

    private String name;   

    public Player(String name) {

        this.name = name;

    }

    @Override

    public String getName() {

        return name;

    }  

    @Override

    public void setName(String name) {

        this.name = name;

    }

    @Override

    public void beAttacked(AllayControlCenter acc) {

        System.out.println(this.name + "被攻击,请求支援");

        acc.notifyObserver(name);

    }

    @Override

    public void help() {

        System.out.println("坚持住," + this.name +"马上到");

    }

}

public class ConcreteAllayControlCenter extends AllayControlCenter {   

    public ConcreteAllayControlCenter(String allyName) {

        System.out.println(allyName + "战队组建成功");

        this.allayName = allyName;

        System.out.println("--------------------------");

    }  

    @Override

    public void notifyObserver(String name) {

        System.out.println(this.getAllayName() + "战队紧急通知,盟友" + name + "收到攻击,请求支援");       

        //遍历队友集合,推送救援消息,去除给自己推送信息

        for(Observer obs : ObsList) {

            if(!obs.getName().equals(name)) {

                obs.help();

            }

        }

    }

}

 

public class Main {

    public static void main(String[] args) {       

        AllayControlCenter acc = new ConcreteAllayControlCenter("西游大哥");

        Observer ts = new Player("唐僧");

        acc.join(ts);

        Observer wk = new Player("悟空");

        acc.join(wk);

        Observer bj = new Player("八戒");

        acc.join(bj);

        Observer wj = new Player("悟净");

        acc.join(wj);      

        Observer xbl = new Player("小白龙");

        acc.join(xbl); 

        Observer cyj = new Player("程咬金");

        acc.join(cyj);

        acc.quit(cyj);     

        wj.beAttacked(acc);

    }

}

应用:

  1. JDK中的Observable类 目标类,用Vector存储观察者对象

Observer接口观察者        update();

         用户可以直接使用,自己来定义观察者和目标的实现类

  1. MVC模式: M为目标,V是观察者, C作为中介, V观察M,M改变V改变
  2. java事件监听机制

 

优势:表示层和数据逻辑层分离; 通过抽象耦合,无需关注具体观察者;符合开闭原则;支持一对多广播式通信。

 

缺点:观察者过多时通知时间花费大;观察者和目标之间存在循环依赖时可能导致系统崩溃;观察者只知目标变化不知发生怎样变化

 

 

本文知识源自刘伟老师编著清华大学出版社出版《java设计模式》一书

适用:

  1. 一个模型存在两个方面,并且一方面依赖另一方面,还要讲两方面各种封装
  2. 一个改变,另外多个会改变   但是不知的有多少改变,也不知道改变了什么
  3. 可以触发链式触发机制  A改变影响B   B改变影响C…

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值