代理模式:静态代理与动态代理

代理模式

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

组成:

抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。

类图:

这里写图片描述

静态代理与动态代理

静态代理在编译时期确定下来,动态代理是在运行时生成的一个代理对象。如果代理的真实对象比较多,采用静态代理会造成代理类成倍增加,如果采用动态代理则可以避免这种情况。但是,动态代理是通过反射调用。

静态代理代码实现:

ISubject接口

public interface ISubject {
    public void request();
}

RealSubject(真实的代理类)

public class RealSubject implements ISubject {
    @Override
    public void request() {
        Log.e("zhang", "RealSubject request ");
    }
}

ProxySubject(代理类)

public class ProxySubject implements ISubject {

    private ISubject subject;

    public ProxySubject(ISubject subject) {
        this.subject = subject;
    }

    @Override
    public void request() {
        if (subject != null) {
            Log.e("zhang", "ProxySubject before ");
            subject.request();
            Log.e("zhang", "ProxySubject after ");
        }
    }
}

程序入口MainActivity

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ISubject subject = new RealSubject();
        ProxySubject proxy = new ProxySubject(subject);
        proxy.request();
    }
}

打印结果:

ProxySubject before 
RealSubject request 
ProxySubject after 

动态代理类图

image

动态代理代码实现:

ISubject接口

public interface ISubject {
    public void request();
}

RealSubject

public class RealSubject implements ISubject {
    @Override
    public void request() {
        Log.e("zhang", "RealSubject request ");
    }
}

Proxy(代理类实现InvocationHandler接口)

public class Proxy implements InvocationHandler {

    private Object subject;

    public Proxy(Object object) {
        this.subject = object;
    }

    @Override
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
        Log.e("zhang", "动态代理");
        return method.invoke(subject, objects);
    }
}

程序入口:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ISubject subject = new RealSubject();

        InvocationHandler handler = new Proxy(subject);
        subject = (ISubject) java.lang.reflect.Proxy.newProxyInstance(handler.getClass().getClassLoader(), subject.getClass().getInterfaces(), handler);
        subject.request();

    }
}

打印结果:

动态代理
RealSubject request 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值