标签:
接上篇:java多线程(一)http://www.cnblogs.com/ChaosJu/p/4528895.html
java实现多线程的方式二,实现Runable接口用到设计模式——静态代理模式
代理模式(Proxy Pattern)是对象的结构型模式,代理模式给某一个对象提供了一个代理对象,并由代理对象控制对原对象的引用。
代理模式不会改变原来的接口和行为,只是转由代理干某件事,代理可以控制原来的目标,例如:代理商,代理商只会卖东西,但并不会改变行为,不会制造东西。
楼主我要结婚,但是怕麻烦,所以找婚庆公司帮忙布置洞房、搭场景、主持婚礼,大家要清楚真正结婚的是我不是婚庆公司,我们的共同的目的就是结婚顺利,
其实就是我结婚找婚庆公司帮忙,婚庆公司帮我完婚,并且加了很多修饰。
角色分析:
真实角色:楼主
代理角色:婚庆公司
抽象角色(共同的接口): 结婚
/** * 静态代理 设计模式 * 1、真实角色 * 2、代理角色: 持有真实角色的引用 * 3、二者 实现相同的接口 * * @author chaosju * */ public class StaticProxy { public static void main(String[] args) { //创建真实角色 Marry you =new LouZhu(); //创建代理角色 +真实角色的引用 Marry company =new WeddingCompany(you); //执行任务 company.marry(); } } //接口 interface Marry{ public abstract void marry(); } //真实角色 class LouZhu implements Marry{ @Override public void marry() { System.out.println("LouZhu and 嫦娥结婚了...."); } } //代理角色 class WeddingCompany implements Marry{ private Marry louzhu; public WeddingCompany() { } public WeddingCompany(Marry louzhu) { this.louzhu = louzhu; } private void before(){ System.out.println("布置洞房...."); } private void after(){ System.out.println("闹洞房...."); }
@Override public void marry() { before(); louzhu.marry(); after(); } }
执行结果:
缺点:
1)代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。
2)代理对象只服务于一种类型的对象,如果要服务多类型的对象。势必要为每一种对象都进行代理,静态代理在程序规模稍大时就无法胜任了。
举例说明:代理可以对实现类进行统一的管理,如在调用具体实现类之前,需要打印日志等信息,这样我们只需要添加一个代理类,在代理类中添加打印日志的功能,然后调用实现类,这样就避免了修改具体实现类。满足我们所说的开闭原则。但是如果想让每个实现类都添加打印日志的功能的话,就需要添加多个代理类,以及代理类中各个方法都需要添加打印日志功能(如上的代理方法中删除,修改,以及查询都需要添加上打印日志的功能)。
即静态代理类只能为特定的接口(Service)服务。如想要为多个接口服务则需要建立很多个代理类。则需要引入动态代理。
//实现runnable接口的线程类 public class Programmer implements Runnable { public void run() { for(int i=0;i<1000;i++){ System.out.println("一边敲helloworld...."); } } } public class ProgrammerApp { public static void main(String[] args) { //1)、创建真实角色 Programmer pro =new Programmer(); //2)、创建代理角色 +真实角色引用 Thread proxy =new Thread(pro); //3)、调用 .start() 启动线程 proxy.start(); } }
为什么上述的方式实现静态代理?
标签:
原文地址:http://www.cnblogs.com/ChaosJu/p/4531795.html