代理模式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();
    }
    
}
/*
 * 第三次使用的是代理模式,代理对象内部构成了一个原对象,然后使用原对象的方法完成指定操作。与装饰者模式类似,不同的是传入的只是构造原对象的重要组件,而不是原对象,而且不存在增强。
 * */

 

代理模式图解:

 

实际操作:

让代理类和实际操作类实现同一个接口。代理类中包含一个实际类对象,在创建代理类对象的时候隐式创建实际类对象,然后调用代理类的方法本质上都是调用是实际类对象的对应方法。

与装饰者模式类似。

posted @ 2016-11-02 09:45  guodaxia  阅读(184)  评论(0编辑  收藏  举报