设计模式-------代理设计模式

 

代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象。代理对象可以在客户端和目标对象之间起到中介的作用。代理对象可以完成比原对象更多的职责,当需要为原对象添加横切关注功能时,就可以使用原对象的代理对象。

好处:职责清晰、降低系统耦合、提高扩展性

代理(Proxy)是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理。

代理模式涉及的对象:抽象角色(公共接口)、真实角色(被代理类)、代理角色(代理类)

代理模式有两种实现的方式,一种是静态代理,另一种是动态代理。

静态代理

代理对象是由程序猿创建的,而且一个Proxy一般就只能代理一类目标对象(实现共同Subject接口),相当于代理类和被代理类关系提前要确定。

代理接口

public interface Subject {
    void action();
}

目标对象实现接口

public class RealASubject implements Subject {

    @Override
    public void action() {
        System.out.println("*********  realASubject");
    }
}
public class RealBSubject implements Subject {
    @Override
    public void action() {
        System.out.println("********* realBSubject");
    }
}

代理对象

public class ProxySubject implements Subject{
    private Subject subject;
    public ProxySubject(Subject subject){
        this.subject = subject;
    }

    @Override
    public void action() {
        subject.action();
    }
}

调用

public class Client {
    public static void main(String[] args) {
        ProxySubject subjectA = new ProxySubject(new RealASubject());
        subjectA.action();

        ProxySubject subjectB = new ProxySubject(new RealBSubject());
        subjectB.action();
    }
}

结果

 

动态代理 

动态代理是根据代理的对象,动态创建代理类。避免静态代理中代理类接口过多的问题。动态代理是通过反射来实现的,借助Java自带的java.lang.reflect.Proxy,通过固定的规则生成。

动态代理实现时的代理接口与接口实现与静态代理相同,区别开始是第三步创建代理类。

public class DynamicProxy implements InvocationHandler {
    private Object  object;
    public DynamicProxy(Object object){
        this.object = object;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object res = method.invoke(object, args);
        return res;
    }
}

调用

public class Client {
    public static void main(String[] args) {

        Subject realASubject = new RealASubject();
        DynamicProxy proxy = new DynamicProxy(realASubject);
        ClassLoader classLoader = realASubject.getClass().getClassLoader();
        Subject subjectA = (Subject) Proxy.newProxyInstance(classLoader, new  Class[]{Subject.class}, proxy);
        subjectA.action();
    }

 

结果

 


要求:

为ArrayList创建一个动态代理类

    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        List<String> p = (List<String>) Proxy.newProxyInstance(list.getClass().getClassLoader(), list.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                return method.invoke(list, args);
            }
        });
        p.add("哈哈");
        System.out.println(list);
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java设计模式是一组经过实践验证的面向对象设计原则和模式,可以帮助开发人员解决常见的软件设计问题。下面是常见的23种设计模式: 1. 创建型模式(Creational Patterns): - 工厂方法模式(Factory Method Pattern) - 抽象工厂模式(Abstract Factory Pattern) - 单例模式(Singleton Pattern) - 原型模式(Prototype Pattern) - 建造者模式(Builder Pattern) 2. 结构型模式(Structural Patterns): - 适配器模式(Adapter Pattern) - 桥接模式(Bridge Pattern) - 组合模式(Composite Pattern) - 装饰器模式(Decorator Pattern) - 外观模式(Facade Pattern) - 享元模式(Flyweight Pattern) - 代理模式(Proxy Pattern) 3. 行为型模式(Behavioral Patterns): - 责任链模式(Chain of Responsibility Pattern) - 命令模式(Command Pattern) - 解释器模式(Interpreter Pattern) - 迭代器模式(Iterator Pattern) - 中介者模式(Mediator Pattern) - 备忘录模式(Memento Pattern) - 观察者模式(Observer Pattern) - 状态模式(State Pattern) - 策略模式(Strategy Pattern) - 模板方法模式(Template Method Pattern) - 访问者模式(Visitor Pattern) 4. 并发型模式(Concurrency Patterns): - 保护性暂停模式(Guarded Suspension Pattern) - 生产者-消费者模式(Producer-Consumer Pattern) - 读写锁模式(Read-Write Lock Pattern) - 信号量模式(Semaphore Pattern) - 线程池模式(Thread Pool Pattern) 这些设计模式可以根据问题的特点和需求来选择使用,它们提供了一些可复用的解决方案,有助于开发高质量、可维护且易于扩展的软件系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值