本篇通过模拟结婚,和模拟12306抢票两个实例,了解静态代理设计模式的使用。
概述
1、公共接口:
- 1、真实角色
- 2、代理角色
2、代理设计模式
代理模式分为动态和静态。
共享资源:一份资源可以有多个代理。发生并发时,要注意线程安全处理。
实例一:模拟结婚
1、完整代码
public class StaticProxy {
public static void main(String[] args) {
new WeddingCompany(new You()).happyMarry();
//new Thread(具体的线程对象).start();
}
}
interface Marry{
void happyMarry();
}
//真实角色
class You implements Marry{
public void happyMarry(){ //重写方法
System.out.println("你和嫦娥终于奔月啦~");
}
}
//代理角色
class WeddingCompany implements Marry{
//真实角色
private Marry target;
public WeddingCompany(Marry target){
this.target = target;
}
public void happyMarry(){ //重写方法
ready(); //可做记录监控用
this.target.happyMarry();
after();
}
private void ready(){
System.out.println("布置猪窝...");
}
private void after(){
System.out.println("闹玉兔...");
}
}
2、结果
实例二:12306抢票器
1、完整代码
public class Web12306 implements Runnable{
//票数
private int ticketNums = 20;
public void run(){
while(true){
if(ticketNums<0)break;
//run方法不能throws出异常,也没有返回值
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);
}
}
public static void main(String[] args) {
//一份资源
Web12306 web = new Web12306();
//多个代理
new Thread(web,"小明").start();
new Thread(web,"小军").start();
new Thread(web,"小强").start();
}
}
2、结果
3、分析
我们可以看到,加上sleep模拟网络延时后,数据发生错误,出现了负值。这是由于并发操作导致线程不安全的原因,具体如何解决,我们会在之后的博文中,继续分析。