设计模式(一)—— 代理模式
一、设计模式的概念
1.1 设计模式(Design pattern)
是一套被反复使用、多数人知晓、经过分类编目的代码设计经验的总结。
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码的可扩展性和可维护性。
通用设计模式有23种。
1.2 设计模式的本质
面向对象设计原则
要真正理解设计模式就需要透彻理解面向对象设计原则和面向对象的三大特性(封装、继承、多态)
面向对象编程技术
设计模式的本质是面向对象编程技术 的熟练和灵活运用。
二、代理设计模式
代理模式分为静态代理和动态代理
静态代理
在程序运行前由开发人员提前为目标类创建代理类
动态代理
在程序运行时运用反射机制动态的为目标类创建代理类(Spring AOP采用动态代理)
2.1 解决的问题
代理模式是为目标对象创建代理对象以提供一种代理机制,让代理对象能控制目标对象的访问,并且可以在不改变目标对象的情况下为目标对象添加额外的功能。
2.2 实现方式
创建一个接口,让目标对象和代理对象实现该接口。在代理类中引用目标类的对象,并且代理类可为目标对象添加功能
/*
* <一句话功能简述>
* <代理接口>
* @Author Administrator on 2020/10/21 0021 上午 11:25
* @Param
* @return
**/
public interface ISellerProxy
{
public int sell();
}
/**
* @author :
* @date :Created in 2020/10/21 0021 上午 11:26
* @description:商品厂家目标类
* @modified By:
* @version: $
*/
public class GoodsTarget implements ISellerProxy
{
@Override
public int sell()
{
return 200;
}
}
/**
* @author :
* @date :Created in 2020/10/21 0021 上午 11:28
* @description:商品代理类
* @modified By:
* @version: $
*/
public class GooodsProxy implements ISellerProxy
{
private GoodsTarget target;//目标对象
public GooodsProxy(){
this.target = new GoodsTarget();
}
@Override
public int sell()
{
int price = target.sell();
price += 10;
return price;
}
}
创建客户类,获得代理类对象
/** * @author :yzl * @date :Created in 2020/10/21 0021 上午 11:32 * @description:客户类 * @modified By: * @version: $ */ public class Customer { public static void main(String[] args) { GooodsProxy gooodsProxy = new GooodsProxy(); int price = gooodsProxy.sell(); System.out.println("购买商品:"+gooodsProxy); } }
2.3 代理模式的优缺点
优点
1.代理模式在客户端对象和目标对象之间起到的一个中介作用和保护目标对象的作用
2.代理对象可以扩展目标对象的功能
3.代理模式能将客户对象与目标对象分离,在一定的程度上降低了系统的耦合度,增加了程序的可扩展性。
缺点
1.代理模式会造成系统设计中类的数量增加
2.在客户对象和目标对象之间增加了一个代理对象,会造成请求处理的速度变慢。
3.在一定程度上增加了系统的复杂度。
2.4 代理模式的使用场景
1.远程代理 为一个位于不同网络计算机的对象提供一个本地的代理(如本地网盘)
2.虚拟代理 如果需要创建一个消耗比较大的对象,先创建一个消耗较小的对象来表示,真实对象只在需要的时候才被真实创建(如图片显示)
3.安全代理 用来控制不同种类客户对真实对象的访问权
4.智能指引 注意用于调用模板对象时,代理附加一些额外的处理功能(GC垃圾回收)
5.延迟加载 为了提高系统的性能,延迟对目标对象的加载(如MyBatis的延时加载)