大话设计模式-代理模式

本文转载自点击打开链接
需求
模拟男孩代别人送礼物给女孩。
实现

public class SchoolGirl  
{  
    public String name;  
    public String getName()  
    {  
        return this.name;  
    }  
    public void setName(String name)  
    {  
        this.name=name;  
    }  
} 
public interface GiveGift  
{  
    void giveDolls();  
    void giveFlowers();  
    void giveChocolate();  
}  
public class Pursuit implements GiveGift  
{  
    SchoolGirl mm;  
    public Pursuit(SchoolGirl mm)  
    {  
        this.mm=mm;  
    }  
    public void giveDolls()  
    {  
        System.out.println(mm.name+" 送你洋娃娃");  
    }  
    public void giveFlowers()  
    {  
        System.out.println(mm.name+" 送你鲜花");  
    }  
    public void giveChocolate()  
    {  
        System.out.println(mm.name+" 送你巧克力");  
    }  
}  
public class Proxy implements GiveGift  
{  
    Pursuit gg;  
    public Proxy(SchoolGirl mm)  
    {  
        gg=new Pursuit(mm);  
    }  
    public void giveChocolate()  
    {  
        gg.giveChocolate();  
    }  
    public void giveDolls()  
    {  
        gg.giveDolls();  
    }  
    public void giveFlowers()  
    {  
        gg.giveFlowers();  
    }  
}  
public class Main  
{  
    public static void main(String[] args)  
    {  
        SchoolGirl jiaojiao=new SchoolGirl();  
        jiaojiao.setName("李娇娇");  
        Proxy daili=new Proxy(jiaojiao);  
        daili.giveDolls();  
        daili.giveFlowers();  
        daili.giveChocolate();  
    }  
}  
代理模式,为其他对象提供一种代理以控制对这个对象的访问。一般来说可以分为以下几种:远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象,这样就可以达到性能的最优化。安全代理,用来控制真实对象访问时的权限,一般用于对象应该有不同的访问权限的时候。智能代理,是指当调用真实对象时,代理处理另外一些事。如计算真实对象的引用次数,这样当该对象没有引用时,可以自动释放它;或当第一次引用一个持久对象时,将它装入内存;或在访问一个实际对象前,检查是否已经锁定它,以确保其他对象不能改变它。

//Subject类,定义了RealSubject和Proxy的共用接口
public interface Subject  
{  
    public void request();  
}  
//RealSubject类,定义Proxy所代表的真实实体  
public class RealSubject implements Subject  
{  
    public void request()  
    {  
        System.out.println("真实的请求");  
    }  
}  
//Proxy类,保存一个引用使用代理可以访问实体,并提供一个与Subject的接口相同的接口 
public class Proxy implements Subject  
{  
    RealSubject realSubject;  
    public void request()  
    {  
        if(null==realSubject)  
        {  
            realSubject=new RealSubject();  
        }  
        realSubject.request();  
    }  
}  
//客户端代码  
public class Main  
{  
    public static void main(String[] args)  
    {  
        Proxy proxy=new Proxy();  
        proxy.request();  
    }  
} 
回顾我们前面提到的装饰模式,可以发现代理模式和装饰模式有很多相似之处。对装饰模式来说,装饰者和被装饰者都实现同一个接口;对代理模式来说,代理类和真实处理的类都实现同一个接口。此外,不论我们使用哪一个模式,都可以很容易地在真实对象的方法前面或者后面加上自定义的方法。实际上,装饰模式和代理模式还是有很多差别的。装饰模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话说,当我们使用代理模式的时候,常常在一个代理类中创建一个对象的实例,代理类可以对它的客户隐藏一个对象的具体信息;当我们使用装饰模式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。




你可能感兴趣的:(大话设计模式-代理模式)