纯文学程序员

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

2017-04-01  本文已影响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!!

上一篇下一篇

猜你喜欢

热点阅读