﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-jimingminlovefly-文章分类-designerModule</title><link>http://www.blogjava.net/jimingminlovefly/category/51159.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 12 Jun 2012 00:29:19 GMT</lastBuildDate><pubDate>Tue, 12 Jun 2012 00:29:19 GMT</pubDate><ttl>60</ttl><item><title>设计模式-工厂模式</title><link>http://www.blogjava.net/jimingminlovefly/articles/372207.html</link><dc:creator>计明敏</dc:creator><author>计明敏</author><pubDate>Mon, 19 Mar 2012 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/jimingminlovefly/articles/372207.html</guid><wfw:comment>http://www.blogjava.net/jimingminlovefly/comments/372207.html</wfw:comment><comments>http://www.blogjava.net/jimingminlovefly/articles/372207.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jimingminlovefly/comments/commentRss/372207.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jimingminlovefly/services/trackbacks/372207.html</trackback:ping><description><![CDATA[<p>&nbsp;<span style="font-size: 16px"><strong>一、工厂模式主要是为创建对象提供过渡接口，以便将创建对象的具体过程屏蔽隔离起来，达到提高灵活性的目的。</strong></span></p>&nbsp;<br /><br />
<div>工厂模式在《Java与模式》中分为三类：<br />1）简单工厂模式（Simple Factory）：不利于产生系列产品；<br /><br />2）工厂方法模式（Factory Method）：又称为多形性工厂；<br /><br />3）抽象工厂模式（Abstract Factory）：又称为工具箱，产生产品族，但不利于产生新的产品；<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 这三种模式从上到下逐步抽象，并且更具一般性。<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> GOF在《设计模式》一书中将工厂模式分为两类：工厂方法模式（Factory Method）与抽象工厂模式（Abstract Factory）。将简单工厂模式（Simple Factory）看为工厂方法模式的一种特例，两者归为一类。<br /><br /><br /><span style="font-size: 16px"><strong>二、简单工厂模式</strong></span><br /><br />简单工厂模式又称<strong>静态工厂方法模式</strong>。重命名上就可以看出这个模式一定很简单。它存在的目的很简单：定义一个用于创建对象的接口。</div>
<div><br />在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,它决定那一个产品类应当被实例化, 如同一个交通警察站在来往的车辆流中,决定放行那一个方向的车辆向那一个方向流动一样。</div>
<div>&nbsp; <wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 先来看看它的组成：<br /><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1) 工厂类角色：这是本模式的核心，含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。<br /><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 2) 抽象产品角色：它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。<br /><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 3) 具体产品角色：工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。<br /><br /><span style="font-size: 16px"><strong>三、工厂方法模式</strong></span></div>
<div><br />工厂方法模式是简单工厂模式的进一步抽象化和推广，工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。<br />　　来看下它的组成：<br /><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1)抽象工厂角色：这是工厂方法模式的核心，它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。<br /><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 2)具体工厂角色：它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。<br /><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 3)抽象产品角色：它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。<br /><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 4)具体产品角色：具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的&#8220;上帝类&#8221;。正如上面所说，这样便分担了对象承受的压力；而且这样使得结构变得灵活起来&#8212;&#8212;当有新的产品（即暴发户的汽车）产生时，只要按照抽象产品角色、抽象工厂角色提供的合同来生成，那么就可以被客户使用，而不必去修改任何已有的代码。可以看出工厂角色的结构也是符合开闭原则的！<br /><br />代码： 
<div>//抽象产品角色<br />public interface Moveable {<br />&nbsp;&nbsp;&nbsp; void run();<br />}<br />//具体产品角色<br />public class Plane implements Moveable {<br />&nbsp;&nbsp;&nbsp; @Override<br />&nbsp;&nbsp;&nbsp; public void run() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("plane....");<br />&nbsp;&nbsp;&nbsp; }<br />}<br /><br />public class Broom implements Moveable {<br />&nbsp;&nbsp;&nbsp; @Override<br />&nbsp;&nbsp;&nbsp; public void run() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("broom.....");<br />&nbsp;&nbsp;&nbsp; }<br />}</div>
<div><br />//抽象工厂<br />public abstract class VehicleFactory {<br />&nbsp;&nbsp;&nbsp; abstract Moveable create();<br />}</div>
<div>//具体工厂<br />public class PlaneFactory extends VehicleFactory{<br />&nbsp;&nbsp;&nbsp; public Moveable create() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return new Plane();<br />&nbsp;&nbsp;&nbsp; }<br />}</div>
<div>public class BroomFactory extends VehicleFactory{<br />&nbsp;&nbsp;&nbsp; public Moveable create() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return new Broom();<br />&nbsp;&nbsp;&nbsp; }<br />}</div>//测试类<br />public class Test {<br />&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; VehicleFactory factory = new BroomFactory();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Moveable m = factory.create();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m.run();<br />&nbsp;&nbsp;&nbsp; }<br />}<br /><br /><br />可以看出工厂方法的加入，使得对象的数量成倍增长。当产品种类非常多时，会出现大量的与之对应的工厂对象，这不是我们所希望的。因为如果不能避免这种情况，可以考虑使用简单工厂模式与工厂方法模式相结合的方式来减少工厂类：即对于产品树上类似的种类（一般是树的叶子中互为兄弟的）使用简单工厂模式来实现。<br /><br /><strong><span style="font-size: 16px">四、简单工厂和工厂方法模式的比较</span></strong><br /><br />工厂方法模式和简单工厂模式在定义上的不同是很明显的。工厂方法模式的核心是一个抽象工厂类,而不像简单工厂模式, 把核心放在一个实类上。工厂方法模式可以允许很多实的工厂类从抽象工厂类继承下来, 从而可以在实际上成为多个简单工厂模式的综合,从而推广了简单工厂模式。 <br />反过来讲,简单工厂模式是由工厂方法模式退化而来。设想如果我们非常确定一个系统只需要一个实的工厂类, 那么就不妨把抽象工厂类合并到实的工厂类中去。而这样一来,我们就退化到简单工厂模式了。<br /><br /><span style="font-size: 16px"><strong>五、抽象工厂模式</strong></span></div>
<div></div>
<div>代码：</div>
<div>//抽象工厂类</div>
<div>public abstract class AbstractFactory {<br />&nbsp;&nbsp;&nbsp; public abstract Vehicle createVehicle();<br />&nbsp;&nbsp;&nbsp; public abstract Weapon createWeapon();<br />&nbsp;&nbsp;&nbsp; public abstract Food createFood();<br />}</div>
<div>//具体工厂类，其中Food,Vehicle，Weapon是抽象类，</div>
<div>public class DefaultFactory extends AbstractFactory{<br />&nbsp;&nbsp;&nbsp; @Override<br />&nbsp;&nbsp;&nbsp; public Food createFood() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return new Apple();<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; @Override<br />&nbsp;&nbsp;&nbsp; public Vehicle createVehicle() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return new Car();<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; @Override<br />&nbsp;&nbsp;&nbsp; public Weapon createWeapon() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return new AK47();<br />&nbsp;&nbsp;&nbsp; }<br />}</div>
<div>//测试类</div>
<div>public class Test {<br />&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; AbstractFactory f = new DefaultFactory();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Vehicle v = f.createVehicle();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; v.run();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Weapon w = f.createWeapon();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; w.shoot();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Food a = f.createFood();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; a.printName();<br />&nbsp;&nbsp;&nbsp; }<br />}</div>
<div>在抽象工厂模式中，抽象产品 (AbstractProduct) 可能是一个或多个，从而构成一个或多个产品族(Product Family)。 在只有一个产品族的情况下，抽象工厂模式实际上退化到工厂方法模式。</div>
<div><br /><span style="font-size: 16px"><strong>六、总结。</strong></span><br /><br /><span style="color: red">（1）</span><span style="color: red">简单工厂模式是由一个具体的类去创建其他类的实例，父类是相同的，父类是具体的。 <br />（2）工厂方法模式是有一个抽象的父类定义公共接口，子类负责生成具体的对象，这样做的目的是将类的实例化操作延迟到子类中完成。 <br />（3）抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口，而无须指定他们具体的类。它针对的是有多个产品的等级结构。而工厂方法模式针对的是一个产品的等级结构。</span></div> <img src ="http://www.blogjava.net/jimingminlovefly/aggbug/372207.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jimingminlovefly/" target="_blank">计明敏</a> 2012-03-19 16:58 <a href="http://www.blogjava.net/jimingminlovefly/articles/372207.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式-代理模式</title><link>http://www.blogjava.net/jimingminlovefly/articles/372181.html</link><dc:creator>计明敏</dc:creator><author>计明敏</author><pubDate>Mon, 19 Mar 2012 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/jimingminlovefly/articles/372181.html</guid><wfw:comment>http://www.blogjava.net/jimingminlovefly/comments/372181.html</wfw:comment><comments>http://www.blogjava.net/jimingminlovefly/articles/372181.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jimingminlovefly/comments/commentRss/372181.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jimingminlovefly/services/trackbacks/372181.html</trackback:ping><description><![CDATA[<p><font size="2"><span style="font-size: 18pt; color: red">总结：1，代理对象继承真实对象、2，代理对象的方法跟真实对象的方法名一样、3，代理对象的方法调用，是引用了真实对象再调用真实对象的方法</span><br /><br />1、代理模式</font></p>
<p><font size="2">所谓代理，就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下，一个客户不想或者不能够直接引用一个对象，而代理对象可以在客户端和目标对象之前起到中介的作用。<br />代理模式给某一个对象提供一个代理对象，并由代理对象控制对原对象的引用。</font></p>
<p><font size="2">生活中的例子：过年加班比较忙，没空去买火车票，这时可以打个电话到附近的票务中心，叫他们帮你买张回家的火车票，当然这会附加额外的劳务费。但要清楚票务中心自己并不卖票，只有火车站才真正卖票，票务中心卖给你的票其实是通过火车站实现的。这点很重要！</font></p>
<p><font size="2">上面这个例子，你就是&#8220;客户&#8221;，票务中心就是&#8220;代理角色&#8221;，火车站是&#8220;真实角色&#8221;，卖票称为&#8220;抽象角色&#8221;！</font></p>
<p><br /><font size="2">代理模式JAVA代码示例：<br />&nbsp;//抽象角色：抽象类或接口<br /></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://www.open-open.com/home/space-24-do-blog-id-12.html#"><u><font color="#0000ff">源代码</font></u></a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.open-open.com/home/space-24-do-blog-id-12.html#"><u><font color="#0000ff">复制</font></u></a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://www.open-open.com/home/space-24-do-blog-id-12.html#"><u><font color="#0000ff">打印</font></u></a><a onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://www.open-open.com/home/space-24-do-blog-id-12.html#"><u><font color="#0000ff"> </font></u></a></div></div>
<ol class="dp-j"><li class="alt"><span class="keyword">interface</span><span>&nbsp;Business&nbsp;&nbsp;</span></li><li class=""><span>{&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">void</span><span>&nbsp;doAction();&nbsp;&nbsp;</span></span></li><li class=""><span>}&nbsp;&nbsp;</span></li></ol></div><textarea class="java" style="display: none" name="code" rows="10" cols="60"> interface Business
 {
     void doAction();
 }</textarea><br />&nbsp;//真实角色：真正实现了业务逻辑接口<br /><br />//代理角色：自己并未实现业务逻辑接口，而是调用真实角色来实现 
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://www.open-open.com/home/space-24-do-blog-id-12.html#"><u><font color="#0000ff">源代码</font></u></a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.open-open.com/home/space-24-do-blog-id-12.html#"><u><font color="#0000ff">复制</font></u></a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://www.open-open.com/home/space-24-do-blog-id-12.html#"><u><font color="#0000ff">打印</font></u></a><a onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://www.open-open.com/home/space-24-do-blog-id-12.html#"><u><font color="#0000ff"> </font></u></a></div></div>
<ol class="dp-j"><li class="alt"><span class="keyword">class</span><span>&nbsp;BusinessImplProxy&nbsp;</span><span class="keyword">implements</span><span>&nbsp;Business&nbsp;&nbsp;</span></li><li class=""><span>{&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;BusinessImpl&nbsp;bi;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;doAction()&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(bi==</span><span class="keyword">null</span><span>)&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bi&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;BusinessImpl();&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doBefore();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bi.doAction();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doAfter();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;doBefore()&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">"前置处理！"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;doAfter()&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">"后置处理！"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>}&nbsp;&nbsp;</span></li><li class="alt"><span class="comment">//测试类</span><span>&nbsp;&nbsp;</span></li><li class=""><span class="keyword">class</span><span>&nbsp;Test&nbsp;&nbsp;</span></li><li class="alt"><span>{&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//引用变量定义为抽象角色类型</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Business&nbsp;bi&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;BusinessImplProxy();&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bi.doAction();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>}&nbsp;&nbsp;</span></li></ol></div><textarea class="java" style="display: none" name="code" rows="10" cols="60">class BusinessImplProxy implements Business
{
    private BusinessImpl bi;
    public void doAction()
    {
        if (bi==null)
        {
            bi = new BusinessImpl();
        }
        doBefore();
        bi.doAction();
        doAfter();
    }
    public void doBefore()
    {
        System.out.println("前置处理！");
    }
    public void doAfter()
    {
        System.out.println("后置处理！");
    }
}
//测试类
class Test
{
    public static void main(String[] args)
    {
        //引用变量定义为抽象角色类型
        Business bi = new BusinessImplProxy();
        bi.doAction();
    }
}</textarea></font><font size="2"></font> 
<p>&nbsp;</p>
<p><font size="2">所以，借助于JVM的支持，可以在运行时动态生成代理类（&#8220;代理角色&#8221;），我们就可以解决上述代理模式中代码膨胀的问题，使用了动态代理后，&#8220;代理角色&#8221;将不用手动生成，而由JVM在运行时，通过指定类加载器、接口数组、调用处理程序这3个参数来动态生成。</font></p>
<p><font size="2">动态代理模式JAVA代码示例：<br /></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://www.open-open.com/home/space-24-do-blog-id-12.html#"><u><font color="#0000ff">源代码</font></u></a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.open-open.com/home/space-24-do-blog-id-12.html#"><u><font color="#0000ff">复制</font></u></a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://www.open-open.com/home/space-24-do-blog-id-12.html#"><u><font color="#0000ff">打印</font></u></a><a onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://www.open-open.com/home/space-24-do-blog-id-12.html#"><u><font color="#0000ff"> </font></u></a></div></div>
<ol class="dp-j"><li class="alt"><span class="keyword">import</span><span>&nbsp;java.lang.reflect.InvocationHandler;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;<span class="keyword">import</span><span>&nbsp;java.lang.reflect.Proxy;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;<span class="keyword">import</span><span>&nbsp;java.lang.reflect.Method;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;<span class="comment">//抽象角色：java动态代理的实现目前只支持接口，不支持抽象类</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;<span class="keyword">interface</span><span>&nbsp;BusinessFoo&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;{&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">void</span><span>&nbsp;foo();&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;<span class="keyword">interface</span><span>&nbsp;BusinessBar&nbsp;&nbsp;</span></span></li><li class=""><span>{&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;bar(String&nbsp;message);&nbsp;&nbsp;</span></li><li class=""><span>}&nbsp;&nbsp;</span></li><li class="alt"><span class="comment">//真实角色：真正实现业务逻辑方法</span><span>&nbsp;&nbsp;</span></li><li class=""><span class="keyword">class</span><span>&nbsp;BusinessFooImpl&nbsp;</span><span class="keyword">implements</span><span>&nbsp;BusinessFoo&nbsp;&nbsp;</span></li><li class="alt"><span>{&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;foo()&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">"BusinessFooImpl.foo()"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>}&nbsp;&nbsp;</span></li><li class="alt"><span class="keyword">class</span><span>&nbsp;BusinessBarImpl&nbsp;</span><span class="keyword">implements</span><span>&nbsp;BusinessBar&nbsp;&nbsp;</span></li><li class=""><span>{&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;String&nbsp;bar(String&nbsp;message)&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">"BusinessBarImpl.bar()"</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;message;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>}&nbsp;&nbsp;</span></li><li class="alt"><span class="comment">//动态角色：动态生成代理类</span><span>&nbsp;&nbsp;</span></li><li class=""><span class="keyword">class</span><span>&nbsp;BusinessImplProxy&nbsp;</span><span class="keyword">implements</span><span>&nbsp;InvocationHandler&nbsp;&nbsp;</span></li><li class="alt"><span>{&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;Object&nbsp;obj;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;BusinessImplProxy()&nbsp;{&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;BusinessImplProxy(Object&nbsp;obj)&nbsp;{&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.obj&nbsp;=&nbsp;obj;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;Object&nbsp;invoke(Object&nbsp;proxy,Method&nbsp;method,Object[]&nbsp;args)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Throwable&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;result&nbsp;=&nbsp;<span class="keyword">null</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doBefore();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;method.invoke(obj,args);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doAfter();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;result;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;doBefore(){&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">"do&nbsp;something&nbsp;before&nbsp;Business&nbsp;Logic"</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;doAfter(){&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">"do&nbsp;something&nbsp;after&nbsp;Business&nbsp;Logic"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;Object&nbsp;factory(Object&nbsp;obj)&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;cls&nbsp;=&nbsp;obj.getClass();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),</span><span class="keyword">new</span><span>&nbsp;BusinessImplProxy(obj));&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li><li class=""><span class="comment">//测试类</span><span>&nbsp;&nbsp;</span></li><li class="alt"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;DynamicProxy&nbsp;&nbsp;</span></li><li class=""><span>{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Throwable&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BusinessFooImpl&nbsp;bfoo&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;BusinessFooImpl();&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BusinessFoo&nbsp;bf&nbsp;=&nbsp;(BusinessFoo)BusinessImplProxy.factory(bfoo);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bf.foo();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BusinessBarImpl&nbsp;bbar&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;BusinessBarImpl();&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BusinessBar&nbsp;bb&nbsp;=&nbsp;(BusinessBar)BusinessImplProxy.factory(bbar);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;message&nbsp;=&nbsp;bb.bar(<span class="string">"Hello,World"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(message);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></div><textarea class="java" style="display: none" name="code" rows="10" cols="60">import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Proxy;
 import java.lang.reflect.Method;
 //抽象角色：java动态代理的实现目前只支持接口，不支持抽象类
 interface BusinessFoo
 {
     void foo();
 }
 interface BusinessBar
{
    String bar(String message);
}
//真实角色：真正实现业务逻辑方法
class BusinessFooImpl implements BusinessFoo
{
    public void foo()
    {
        System.out.println("BusinessFooImpl.foo()");
    }
}
class BusinessBarImpl implements BusinessBar
{
    public String bar(String message)
    {
        System.out.println("BusinessBarImpl.bar()");
        return message;
    }
}
//动态角色：动态生成代理类
class BusinessImplProxy implements InvocationHandler
{
    private Object obj;
    BusinessImplProxy() {
    }
    BusinessImplProxy(Object obj) {
        this.obj = obj;
    }
    public Object invoke(Object proxy,Method method,Object[] args) throws Throwable
    {
        Object result = null;
        doBefore();
        result = method.invoke(obj,args);
        doAfter();
        return result;
    }
    public void doBefore(){
        System.out.println("do something before Business Logic");
    }
    public void doAfter(){
        System.out.println("do something after Business Logic");
    }
    public static Object factory(Object obj)
    {
        Class cls = obj.getClass();
        return Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),new BusinessImplProxy(obj));
    }
}
//测试类
public class DynamicProxy
{    
    public static void main(String[] args) throws Throwable
    {
        BusinessFooImpl bfoo = new BusinessFooImpl();
        BusinessFoo bf = (BusinessFoo)BusinessImplProxy.factory(bfoo);
        bf.foo();
        System.out.println();
        
        BusinessBarImpl bbar = new BusinessBarImpl();
        BusinessBar bb = (BusinessBar)BusinessImplProxy.factory(bbar);
        String message = bb.bar("Hello,World");
        System.out.println(message);
    }
}</textarea>&nbsp;</font> 
<p>&nbsp;</p>
<p><font size="2">程序流程说明：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new BusinessFooImpl();创建一个&#8220;真实角色&#8221;，传递给工厂方法BusinessImplProxy.factory()，进而初始化&#8220;调用处理器&#8221;&#8212;&#8212;即实现InvocationHandler的类。并返回一个动态创建的代理类实例，由于&#8220;代理角色&#8221;也必然实现了&#8220;抽象角色&#8221;提供的业务逻辑方法，故可向下转型为BusinessBar，并赋值给指向BusinessBar类型的引用bb。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newProxyInstance(ClassLoader loader, Class&lt;?&gt;[] interfaces, InvocationHandler h)方法由程序员来指定参数动态返回需要的代理类，而invoke(Object proxy, Method method, Object[] args) 方法则是由JVM在运行时动态调用的。当执行&#8220;bb.bar("Hello,World");&#8221;方法时，JVM动态指派&#8220;调用处理器&#8221;，向外层 invoke传递参数，并调用method.invoke(obj,args)真正执行！</font></p>
<p><font size="2"><font size="2">BusinessImplProxy.Factory静态方法用来动态生成代理类（&#8220;代理角色&#8221;），在运行时根据不同的业务逻辑接口BusinessFoo和BusinessBar，在运行时分别动态生成了代理角色。&#8220;抽象角色&#8221;、 &#8220;代理角色&#8221;以及调用处理器（实现InvocationHandler接口的类）这三者都可以改变，所以说JAVA的动态代理十分强大。</font></font></p><img src ="http://www.blogjava.net/jimingminlovefly/aggbug/372181.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jimingminlovefly/" target="_blank">计明敏</a> 2012-03-19 11:42 <a href="http://www.blogjava.net/jimingminlovefly/articles/372181.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>