第四章:设计模式-代理模式

一)介绍

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。

主要解决:在直接访问对象时带来的问题,如服务器安全问题,只能提供代理方式进行访问。

何时使用:在访问一个类时需要做一些控制情况。

如何解决:增加中间层,相当于增加一个代理。

 

优点: 1、职责清晰。 2、高扩展性。 3、智能化。

缺点:

1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。

2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

 

使用场景:

按职责来划分,通常有以下使用场景:

1、远程代理。

2、虚拟代理。

3、Copy-on-Write 代理。

4、保护(Protect or Access)代理。

5、Cache代理。

6、防火墙(Firewall)代理。

7、同步化(Synchronization)代理。

8、智能引用(Smart Reference)代理。

 

注意事项:

1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。

2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。

 

二)UML类图

 

三)实现

第一步:创建一个访问对象类

package com.oysept.proxy;

public class SchoolGirl {
    private String name;

    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
}

 

第二步:创建一个接口

package com.oysept.proxy;

public interface GiveGift {
    void giveDolls();
	
    void giveFlowers();
	
    void giveChocolate();
}

 

第三步:接口实现的真实请求

package com.oysept.proxy;

public class Pursuit implements GiveGift {
	
    private SchoolGirl mm;
    public Pursuit(SchoolGirl mm) {
        this.mm = mm;
    }

    @Override
    public void giveDolls() {
        System.out.println(mm.getName() + ",送你洋娃娃!");
    }

    @Override
    public void giveFlowers() {
        System.out.println(mm.getName() + ",送你鲜花!");
    }

    @Override
    public void giveChocolate() {
        System.out.println(mm.getName() + ",送你巧克力!");
    }
}

 

第四步:创建一个代理对象类,代理对SchoolGirl对象的访问

package com.oysept.proxy;

public class Proxy implements GiveGift {
	
    private Pursuit gg;
    public Proxy(SchoolGirl mm) {
        gg = new Pursuit(mm);
    }

    @Override
    public void giveDolls() {
        gg.giveDolls();
    }

    @Override
    public void giveFlowers() {
        gg.giveFlowers();
    }

    @Override
    public void giveChocolate() {
        gg.giveChocolate();
    }
}

 

第五步:测试

package com.oysept.proxy;

public class Test {

    public static void main(String[] args) {
        SchoolGirl girl = new SchoolGirl();
        girl.setName("MiMi");
		
        Proxy proxy = new Proxy(girl);
        proxy.giveDolls();
        proxy.giveFlowers();
        proxy.giveChocolate();
    }
}

 

 

识别二维码关注个人微信公众号

本章完结,待续,欢迎转载!
 
本文说明:该文章属于原创,如需转载,请标明文章转载来源!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值