以下为今天学习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!!
网友评论