设计模式--代理模式

Proxy Pattern,23种常用的面向对象软件的设计模式之一。(设计模式的说法源自《设计模式》一书,原名《Design Patterns: Elements of Reusable Object-Oriented Software》。1995年出版,出版社:Addison Wesly Longman.Inc。该书提出了23种基本设计模式,第一次将设计模式提升到理论高度,并将之规范化。)

1 代理模式定义

为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

2 优点

  • (1).职责清晰
    真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。

  • (2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。

  • (3).高扩展性

3 代理模式实现

代理模式主要是多态的体现,代理对象与被代理对象都实现与同一个接口(保证双方能做一样的事情),再由代理对象干被代理对象的活

  • 1)定义一个公用的上级接口CommonPerson,定义shopping()、bringFood()等方法

  • 2)定义代理对象ProxyPersonA类与被代理对象ProxiedPersonB类,都实现CommonPerson接口,实现所有方法

  • 3)定义调用方Caller类,访问代理对象,却调用的是被代理对象的方法,实现代理模式

4 动态代理与静态代理

代理模式分为静态代理、动态代理。

  • 1)静态代理是由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。

  • 2)动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。

5 代码实现

5.1 统一上级接口

/**
* @Description: 统一上级接口(让代理对象与被代理对象拥有同样的方法才能做同样的事情)
* @Author: qiuxx
* @Date: 19:48 2018/6/18
*/
public interface CommonPerson {

/**
* 购物
*/
public void shopping();

/**
* 带饭
*/
public void bringFood();
}

5.2 代理(与被代理)对象

/**
* @Description: 代理对象A
* @Author: qiuxx
* @Date: 19:50 2018/6/18
*/
public class ProxyPersonA implements CommonPerson {

private CommonPerson commonPerson;

private ProxyPersonA(){

}

public ProxyPersonA(CommonPerson commonPerson){
this.commonPerson = commonPerson;
}

@Override
public void shopping() {
this.commonPerson.shopping();
}

@Override
public void bringFood() {
this.commonPerson.bringFood();
}
}


/**
* @Description: 被代理对象B
* @Author: qiuxx
* @Date: 19:50 2018/6/18
*/
public class ProxiedPersonB implements CommonPerson {

@Override
public void shopping() {
System.out.println("我是被代理的对象B,现在出去购物去");
}

@Override
public void bringFood() {
System.out.println("我是被代理的对象B,现在帮别人带饭去");
}
}

5.3 调用方Caller

/**
* @Description: 调用方(访问代理对象方法,做被代理对象的事情)
* @Author: qiuxx
* @Date: 19:55 2018/6/18
*/
public class Caller {

public static void main(String[] args){
ProxiedPersonB proxiedPersonB = new ProxiedPersonB();//被代理对象B
//创建代理对象A
ProxyPersonA proxyPersonA = new ProxyPersonA(proxiedPersonB);
//看似在访问代理对象A的方法,实际是调用了被代理对象B的方法
proxyPersonA.shopping();
proxyPersonA.bringFood();
}
}


博客地址:https://qiuxx404.github.io/2018/06/18/原创/设计模式/设计模式-代理模式

posted @ 2018-06-18 20:10  qiuxx404  阅读(114)  评论(0)    收藏  举报