目录:
(一)启动步骤
(二)静态代理举例
(三)实际运用
(四)与Thread创建线程的优缺点
(一)
必须实现Runnable+run()方法
启动:使用静态代理。
1、创建真实角色
2、创建代理角色 Thread+引用
3、代理角色.start
(二)静态代理举例(婚庆中介)
/**
* 静态代理设计模式
* 1、真实角色
* 2、代理角色:持有真实角色的引用
* 3、要求:二者实现相同的接口
* @author john
*
*/
public class StaticProxy {
public static void main(String[] args){
//创建真实角色
You you=new You();
//创建代理角色+真实角色的引用
WeddingCompany company=new WeddingCompany(you);
//执行任务
company.marry();
}
}
//接口
interface Marry{
public abstract void marry();
}
//真实角色
class You implements Marry{
public void marry(){
System.out.println("you and me marry");
}
}
//代理角色
class WeddingCompany implements Marry{
private Marry you;
public WeddingCompany(){
}
public WeddingCompany(Marry you){
this.you=you;
}
private void before(){
System.out.println("买房买车");
}
private void after(){
System.out.println("生孩子!");
}
public void marry(){
before();
after();
you.marry();
}
}
(三)运用举例:12036购票网站
/**
* 利用Runnable接口,资源共享,模拟购票
* @author john
*
*/
public class Web12306 implements Runnable{
private int num=50;
public void run(){
while(true){
if(num<0){
break;//跳出循环
}
System.out.println(Thread.currentThread().getName()+"抢到了"+num--);
}
}
public static void main(String[] args){
//真实角色
Web12306 web=new Web12306();
//代理
Thread t1=new Thread(web,"路人甲");
Thread t2=new Thread(web,"黄牛已");
Thread t3=new Thread(web,"攻城狮");
//启动线程
t1.start();
t2.start();
t3.start();
}
}
(四)推荐实现Runnable接口
继承Thread类的缺点:我们的类已经从一个类继承(如小程序必须继承自Applet类),则无法再继承Thread类。
实现Runnable接口优点: 1)避免单继承的局限性 2)便于共享资源(如上述12306购票)