美文网首页纯文学程序员
模拟个推信息推送 | 实现java观察者模式

模拟个推信息推送 | 实现java观察者模式

作者: 青城楼主 | 来源:发表于2017-04-01 17:15 被阅读121次

    以下为今天学习Java观察者模式,模拟个推信息推送写的相关代码。

    1.首先,建一个用于app用户接受信息的接口

    package com.obsermodel3;

    //接受推送接口

    public interface GetMsg {

    public void mymsg();

    }

    2.因为每个app用户其实后台都有一个线程用于接受个推推送过来的信息,所以可以进行抽象,写一个抽象类

    ackage com.obsermodel3;

    public abstract class AbstractCs implements GetMsg{

    private  Runnable rn;

    {

    rn=new Runnable() {

    public void run() {

    while(true){

    try {

    Thread.sleep(5000);

    if(isCon()){

    mymsg();

    break;

    }

    } catch (InterruptedException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    }

    };

    }

    abstract public boolean isCon();

    public Runnable getRn() {

    return rn;

    }

    }

    注:isCon 为判断个推推送的用户是否包含当前用户,这个在挑用子类方法,因为在抽象类无法得到子类的方法。这个也美其名在设计模式中未模板模式。

    3.新建两个app用户

    package com.obsermodel3;

    public class AppUser1  extends AbstractCs {

    @Override

    public void mymsg() {

    // TODO Auto-generated method stub

    System.out.println("App1接收推送信息:"+Msg.getMsg());

    }

    @Override

    public boolean isCon() {

    // TODO Auto-generated method stub

    if(FlagClass.getFlag().contains(this)){

    return true;

    }else{

    return false;

    }

    }

    }

    package com.obsermodel3;

    public class AppUser2 extends AbstractCs{

    @Override

    public void mymsg() {

    // TODO Auto-generated method stub

    System.out.println("App2接收推送信息:"+Msg.getMsg());

    }

    @Override

    public boolean isCon() {

    // TODO Auto-generated method stub

    if(FlagClass.getFlag().contains(this)){

    return true;

    }else{

    return false;

    }

    }

    }

    4,客户端app用户代码已经完了

    5.开始模拟写个推后台,首先写一个个推功能接口

    package com.obsermodel3;

     import java.util.List;

    //类似个推功能的接口

    public interface GeTui { 

    //增加app用户,相当于增加接收推送的接口

    public void addGetmsg(GetMsg getmsg);

    //发送推送

    public void pusmsg(Listgets,String msg);

    }

    6.新建个推实现

    package com.obsermodel3;

    import java.util.ArrayL

    ist;import java.util.List;

    public class GeTuiImp extends AbstractClass

    {

    private Listgets=new ArrayList();

    public ListgetGets() {return gets;} 

    @Override

    public void addGetmsg(GetMsg getmsg)

     {

    // TODO Auto-generated method stub

    gets.add(getmsg); 

    }

    @Overridepublic void pusmsg(Listgets, String msg) {

    // TODO Auto-generated method stub

    gets=this.gets;

    Msg.setMsg(msg);

    for(GetMsg g:gets){

    FlagClass.addGetMsg(g);

    }

    }

    }

    注:FlagClass 和 Msg为工具类,FlagClass 主要用于记录后端都给那些app用户发了推送,Msg类记录发的具体信息。

    package com.obsermodel3;

    import java.util.ArrayList;

    import java.util.List;

    public class FlagClass {

    private final static Listgs=new ArrayList(); 

    public static void addGetMsg(GetMsg g){    

      gs.add(g);

    }

    public static ListgetFlag(){

    return gs;

    }

    }

    package com.obsermodel3;

    public class Msg {

    private static String msg="";

    public static void setMsg(String msgs){

    msg=msgs;

    }

    public static String getMsg(){

    return msg;

    }

    }

    补充:设计中,每个个推实现都有存储发送用户app,这个抽象出来

    package com.obsermodel3; 

    import java.util.List;

      public abstract class AbstractClass implements GeTui{

     abstract public ListgetGets();

    }

    上测试

    package com.obsermodel3;

    public class Ts {

    public static void main(String[] args) {

    AbstractCs g=new AppUser1();

    AbstractCs m=new AppUser2();

    Thread t1=new Thread(g.getRn());

    t1.start();

    Thread t2=new Thread(m.getRn());

    t2.start();

    AbstractClass gt=new GeTuiImp();

    gt.addGetmsg(g);

    gt.addGetmsg(m);

    System.out.println(gt.getGets().size());

    gt.pusmsg(gt.getGets(), "hello!!");

    }

    }

    打印信息如下

    App2接收推送信息:hello!!

    App1接收推送信息:hello!!

    相关文章

      网友评论

        本文标题:模拟个推信息推送 | 实现java观察者模式

        本文链接:https://www.haomeiwen.com/subject/ikoiottx.html