代理模式Proxy
需求:
小明帮小张送礼物给娇娇。
代码编写:
package com.t_11; import org.junit.Test; /** * 代理模式 * @author Administrator * 故事情节: * 小张请小明帮忙追小娇 */ public class t1 { @Test public void fun(){ XiaoZhang xiaozhang=new XiaoZhang(); xiaozhang.giveFlower(); xiaozhang.giveMilk(); xiaozhang.getChocolate(); } @Test public void fun2(){ XiaoMing xiaozhang=new XiaoMing(); xiaozhang.giveFlower(); xiaozhang.giveMilk(); xiaozhang.getChocolate(); } @Test public void fun3(){ XiaoMing1 xiaoming=new XiaoMing1("娇娇"); xiaoming.getChocolate(); xiaoming.giveFlower(); xiaoming.giveMilk(); } } class XiaoZhang{ public void giveFlower(){ System.out.println("小娇,花"); } public void getChocolate(){ System.out.println("小娇,巧克力"); } public void giveMilk(){ System.out.println("小娇,牛奶"); } } /*前面那是小张直接追求的小娇,也就没有代理这一说法,实际上,小张与小娇是不认识的*/ class XiaoMing{ public void giveFlower(){ System.out.println("小娇,花"); } public void getChocolate(){ System.out.println("小娇,巧克力"); } public void giveMilk(){ System.out.println("小娇,牛奶"); } } /*第二次忽视了小张的存在,也不应该是这样的,应该是小明帮小张送花,本质是小张的行为,而且,小张应该不认识小娇,所以不能直接给名字。*/ abstract class Gift{ public abstract void giveFlower(); public abstract void getChocolate(); public abstract void giveMilk(); } class XiaoZhang1 extends Gift{ private String name; public XiaoZhang1(String name){this.name=name;} @Override public void giveFlower() { System.out.println(name+",花"); } @Override public void getChocolate() { System.out.println(name+",巧克力"); } @Override public void giveMilk() { System.out.println(name+",牛奶"); } } class XiaoMing1 extends Gift{ private XiaoZhang1 xiaozhang1; public XiaoMing1(String girlName){ xiaozhang1=new XiaoZhang1(girlName); } @Override public void giveFlower() { xiaozhang1.giveFlower(); } @Override public void getChocolate() { xiaozhang1.getChocolate(); } @Override public void giveMilk() { xiaozhang1.giveMilk(); } } /* * 第三次使用的是代理模式,代理对象内部构成了一个原对象,然后使用原对象的方法完成指定操作。与装饰者模式类似,不同的是传入的只是构造原对象的重要组件,而不是原对象,而且不存在增强。 * */
代理模式图解:
实际操作:
让代理类和实际操作类实现同一个接口。代理类中包含一个实际类对象,在创建代理类对象的时候隐式创建实际类对象,然后调用代理类的方法本质上都是调用是实际类对象的对应方法。
与装饰者模式类似。