设计模式--代理模式
Posted qiuxx404
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式--代理模式相关的知识,希望对你有一定的参考价值。
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/原创/设计模式/设计模式-代理模式
以上是关于设计模式--代理模式的主要内容,如果未能解决你的问题,请参考以下文章