代理模式是一種很巧妙的設計方式,經過設置代理能夠達到不暴露實際的動做類,代理模式主要使用了Java的多態,幹活的是被代理類,代理類是顯式調用的一方 下面來看代碼:首先建立一個Action的接口java
package com.wzl.proxy; /** * @author wuzhilang * @Title: Action * @ProjectName design_pattern * @Description: * @date 2019/1/3115:11 */ public interface Action { public void eat(); public void swim(); }
我在這個類裏面建立了兩個方法,eat和swim,下面是實現這個接口的人api
package com.wzl.proxy; /** * @author wuzhilang * @Title: Me * @ProjectName design_pattern * @Description: TODO * @date 2019/1/3115:23 */ public class Me implements Action { @Override public void eat() { System.out.println("我吃肉"); } @Override public void swim() { System.out.println("我游泳"); } }
package com.wzl.proxy; /** * @author wuzhilang * @Title: You * @ProjectName design_pattern * @Description: 代理模式的核心 * @date 2019/1/3115:13 */ public class You implements Action { private Action kindWomen; public You(){ this.kindWomen = new Me(); } public You(Action kindWomen){ this.kindWomen=kindWomen; } @Override public void eat() { this.kindWomen.eat(); } @Override public void swim() { this.kindWomen.swim(); } }
這裏Me完成的是eat()和swim(),You在這個裏面的做用主要是關聯Me的動做,You代理了個人存在 最後就是測試類ide
package com.wzl.proxy; /** * @author wuzhilang * @Title: ProxyTest * @ProjectName design_pattern * @Description: TODO * @date 2019/1/3117:14 */ public class ProxyTest { public static void main(String[] args) { You you = new You(); you.eat(); you.swim(); } }
結果的輸出是:測試
"C:\Program Files\Java\jdk1.8.0_111\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2018.3\lib\idea_rt.jar=51884:C:\Program Files\JetBrains\IntelliJ IDEA 2018.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_111\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_111\jre\lib\rt.jar;D:\360Downloads\production\design_pattern;D:\Program Files\Maven\Repositories\org\junit\jupiter\junit-jupiter-api\5.4.0-RC1\junit-jupiter-api-5.4.0-RC1.jar;D:\Program Files\Maven\Repositories\org\apiguardian\apiguardian-api\1.0.0\apiguardian-api-1.0.0.jar;D:\Program Files\Maven\Repositories\org\opentest4j\opentest4j\1.1.1\opentest4j-1.1.1.jar;D:\Program Files\Maven\Repositories\org\junit\platform\junit-platform-commons\1.4.0-RC1\junit-platform-commons-1.4.0-RC1.jar" com.wzl.proxy.ProxyTest 我吃肉 我游泳 Process finished with exit code 0
經過最後的結果,能夠看出,咱們雖然是You在調用接口,最後的Action的動做實體確是Me。this