Structual设计--Proxy 模式

1.意图

为其他对象提供一种代理以控制对这个对象的访问。

2.别名

Surrogate

3.动机

对一个对象进行访问控制的一个愿意是为了只有在我们确实需要这个对象时才对他进行创建和初始化。譬如手机上加载图片,每一个屏幕的大小是有限定的,我们无需每次把所有图片都加载上,只有在需要展示的时候才对图片进行创建和初始化。

4.适用性

在需要用比较通用和复杂的对象指针代理简单的指针的时候,使用Proxy。下面是一些可以使用Proxy模式常见的情况:

  • 远程代理(Remote Proxy)为一个对象在不同的地址空间提供局部代表。
  • 虚代表(Virtual Proxy)根据需要创建开销很大的对象。譬如手机上加载图片
  • 保护代理(Protection Proxy)控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。
  • 智能指引(Smart Reference)取代了简单的指针,它在访问对象时执行了一些附加操作。他的典型用途包括:
  • 对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放它。
  • 在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。

5.结构

其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思。再如我们有的时候展示一些对象,无需实例化非常多的对象,尤其是加载一些非常费内存的对象。先来看看关系图:

其中Sourceable为公共接口,Source为实际对象操作,创建Proxy代理类,当Client调用是时候,只需要与Proxy进行交互。

6.代码示例

代理模式代码:

Source类

public class Source implements Sourceable {

    @Override
    public void method() {
        System.out.println("the original method!");
    }
}

Sourceable类

public interface Sourceable {
    public void method();
}

代理Proxy类

public class Proxy implements Sourceable {

    private Source source;
    public Proxy(){
        super();
        this.source = new Source();
    }
    @Override
    public void method() {
        before();
        source.method();
        atfer();
    }
    private void atfer() {
        System.out.println("after proxy!");
    }
    private void before() {
        System.out.println("before proxy!");
    }
}

Proxy类对Source进行了扩充操作,下面是测试类:

public class ProxyTest {

    public static void main(String[] args) {
        Sourceable source = new Proxy();
        source.method();
    }

}

输出:

before proxy!

the original method!

after proxy!

代理模式的应用场景:

如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法:

1、修改原有的方法来适应。这样违反了“对扩展开放,对修改关闭”的原则。

2、就是采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法就是代理模式。

使用代理模式,可以将功能划分的更加清晰,有助于后期维护,这里没有举例加载手机图片(虚代表)左右,但是是很关键的!

7.相关模式

Adapter模式:适配器Adapter为它所适配的对象提供了一个不同的接口。相反,代理提供与它的实体相同的接口。然而,用于访问保护的代理可能会拒绝执行实体会执行的操作。因此,它的接口实际上可能只是实体接口的一个子集。

Decorator模式:尽管decorator的实现部分与代理相似,但decorator的目的不一样。Decorator为对象添加一个或多个功能,而代理则控制对对象的访问。

代理的实现与decorator实现类似,但是在相似的程度上有所区别。Protection Proxy的实现可能与decorator的实现差不多。另一方面,Remote Proxy不包含对实体的直接引用,而只是一个间接引用,如“主机:ID,主机上的局部地址”。Virtual Proxy开始的时候使用一个间接引用,例如一个文件名。但最终将获取并使用一个直接引用。

引用:

http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm

http://item.jd.com/10057319.html

http://blog.csdn.net/zhangerqing/article/details/8239539

时间: 2024-08-29 05:00:43

Structual设计--Proxy 模式的相关文章

Structual设计--Adapter模式

1.意图 将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原来由于接口不兼容而不能在一起工作的那些类可以在一起工作. 2.别名 包装器Wrapper. 3.动机 有时,为复用而设计的工具箱类不能够被复用原因仅仅是因为它的接口与专业应用领域所需要的接口不匹配.具体场景可以描述为:基础功能类–>adapter专业接口–>专业调用,其中基础功能类可以理解为我们常见的jdk,也可以是一些sdk或者一些平台支持类. 4.适用性 以下情况使用Adapter模式 你想使用一个已经存在的类,而

Structual设计--Flyweight模式

1.意图 运用共享技术有效地支持大量细粒度的对象. 2.别名 无 3.动机 有些应用程序得意于在其整个设计过程中采用对象技术,但简单化的实现代价极大.如我们在使用word的时候,如果设置正文字体为:text.setFont(new Font("細明體", Style.BOLD, 12));每一个文字我们都需要这样设置,内存太大,而且也非常难记,稍有不注意就会出错.所以通常并不是对每个字符都用一个单独的对象去表示.Flyweight模式描述了如何共享对象,是的可以细粒度地使用他们而无需高

Structual设计--Bridge模式

1.意图 将抽象部分与它的实现部分分离,使他们都可以独立地变化. 2.别名 Handle/Body 3.动机 当一个抽象对象可能有多个实现时,通常用继承来协调它们.抽象类定义对该抽象的接口,而具体的子类则用不同方式加以实现.但是此方法有时不够灵活.继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立的进行修改.扩充和重用. 4.适用性 以下情况使用Bridge模式: 你不希望在抽象和它的实现部分之间有一个固定的绑定关系.例如这种情况可能是因为,在程序运行时刻实现部分应可以

Structual设计--Composite模式

1.意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 2.别名 无 3.动机 在绘图编辑器和图形捕捉系统这样的图形应用程序中,用户可以使用简单的组件创建复杂的图表.用户可以组合多个简单组件以形成一些较大的组件,这些组件又可以组合成更大的组件.一个简单的实现方法是为Text和Line这样的图元定义一些类,另外定义一些类作为这些图元的容器类(Container). 然而存在一个问题:使用这些类的代码必需区别对待图元对

Structual设计--Facade模式

1.意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层的接口,这个接口使得这一子系统更加容易使用. 2.别名 无 3.动机 将一个系统划成为若干个子系统有利于降低系统的复杂性.一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小.达到该目标的途径之一是引入一个外观(facade)对象,它为子系统中较一般的设施提供了一个单一而简单的界面.例如算法库有很多算法类,我们在使用的时候分别去调用,最后算法库的外部调用和算法之间的关系会变的错综复杂,这就需要我们引入facad

Structual设计--Decorator 模式

1.意图 动态的给一个对象添加额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 2.别名 包装器Wrapper. 3.动机 有时,我们希望给某个对象而不是整个类添加一些功能.例如,肯德基推出特价套餐,如果套餐1中有:汉堡和鸡腿和价格,套餐二中有:薯条和汉堡和价格,如果做继承类,而且是多继承明显不够灵活,那么就需要装饰类. 4.适用性 以下情况使用Decorator模式 在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责. 处理他那些可以撤销的职责. 当不能采用

Android学习——ActivityManager与Proxy模式的运用

Android学习--ActivityManager与Proxy模式的运用 - Dufresne - 博客园 一 Proxy模式 意图: ?????? 为其他对象提供一种代理以控制这个对象的访问. 适用性: l? 远程代理( Remote Proxy ): 为一个对象在不同的地址空间提供局部代表. l? 虚代理(Virtual Proxy)根据需要创建开销很大的对象.使用一个代理对象作为代表,在真正的需要时进行创建. l? 保护代理(Protection Proxy):控制对原始对象的访问.保护

Structual设计--总结

1.结构型模式的讨论 我们可以注意到了结构型模式之间的相似性,尤其是他们的参与者与协作之间的相似性.这可能是因为结构型模型依赖于同一个很小的语言机制集合构造代码和对象:但继承和多继承机制用于基于类的模型,而对象组合机制用于对象模型.但是这些相似性掩盖了这些模型的不同意图. 2.Adapter和Bridge模式 Adapter模型和Bridge模型具有一些共同的特征.他们都给另一个对象提供了一定程度上的间接性,因为有利于系统的灵活性.他们都涉及到从自身以外的一个接口向这个对象转发请求. 这些模式的

ActivityManager与Proxy模式的运用

Android学习——ActivityManager与Proxy模式的运用 一 Proxy模式 意图: 为其他对象提供一种代理以控制这个对象的访问. 适用性: l  远程代理( Remote Proxy ): 为一个对象在不同的地址空间提供局部代表. l  虚代理(Virtual Proxy)根据需要创建开销很大的对象.使用一个代理对象作为代表,在真正的需要时进行创建. l  保护代理(Protection Proxy):控制对原始对象的访问.保护代理用于对象应该有不同的访问权限的时候. l