简单说说设计模式之代理模式

样例代码

public class DaiLi {
    public DaiLi() {
        /**
         * 步骤4:使用代理
         * 需要使用哪个就代理哪个
         * 使用代理可以满足软件开发的开闭原则,即对功能扩展开放,对修改关闭
         */
        //DaiLiClass.getInstance().init(new Facade1());
        //DaiLiClass.getInstance().init(new Facade2());
        DaiLiClass.getInstance().init(new FacadeN());
    }

    public void start() {
        //使用代理的相应实现方法
        DaiLiClass.getInstance().get();
        DaiLiClass.getInstance().set();
    }
}

/**
 * 步骤1:定义接口
 */
interface DaiLiInterface {
    void get();

    void set();
}

/**
 * 步骤2:对接口进行实现
 */
//接口的第一个实现
class Facade1 implements DaiLiInterface {
    @Override
    public void get() {
        //实现接口的get方法
        System.out.println("我是Facade1的get方法");
    }

    @Override
    public void set() {
        //实现接口的set方法
        System.out.println("我是Facade1的set方法");
    }
}

//接口的第二个实现
class Facade2 implements DaiLiInterface {
    @Override
    public void get() {
        //实现接口的get方法
        System.out.println("我是Facade2的get方法");
    }

    @Override
    public void set() {
        //实现接口的set方法
        System.out.println("我是Facade2的set方法");
    }
}

//接口的第N个实现
class FacadeN implements DaiLiInterface {
    @Override
    public void get() {
        //实现接口的get方法
        System.out.println("我是FacadeN的get方法");
    }

    @Override
    public void set() {
        //实现接口的set方法
        System.out.println("我是FacadeN的set方法");
    }
}

/**
 * 步骤3:对接口进行代理
 */
//代理类
class DaiLiClass implements DaiLiInterface {
    private DaiLiInterface daiLi;

    private DaiLiClass() {
    }

    //单例实现
    public static DaiLiClass getInstance() {
        return DaiLiHolder.instance;
    }

    private static class DaiLiHolder {
        private static final DaiLiClass instance = new DaiLiClass();
    }

    //init方法实现代理
    public void init(DaiLiInterface daiLi) {
        this.daiLi = daiLi;
    }

    @Override
    public void get() {
        //代理调用相应实现类的get方法
        daiLi.get();
    }

    @Override
    public void set() {
        //代理调用相应实现类的set方法
        daiLi.set();
    }
}

上述样例涉及到软件开发的两个原则:单一职责原则和开闭原则,使用到的设计模式有单例模式、外观模式和代理模式,极大的提高了代码的可扩展性和灵活性,此外还有动态代理模式,以后有空会进行补充~

动态代理模式

为什么要用动态代理模式,我的理解是省去创建并维护一个代理类的工作量,比如当上述DaiLiInterface的方法增加时,还要同步增加DaiLiClass中的代码,当方法有很多时,会产生很多没必要的代码,此时可以考虑使用动态代理模式:

样例代码

public class DynamicDaiLI implements InvocationHandler {
    private Object proxyObject;
    private static DaiLiInterface daiLiInterface;

    public Object newProxyInstance(Object proxyObject) {
        this.proxyObject = proxyObject;
        daiLiInterface=(DaiLiInterface)Proxy.newProxyInstance(proxyObject.getClass().getClassLoader(), proxyObject.getClass().getInterfaces(), this);
        return daiLiInterface;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(proxyObject, args);
        return result;
    }

    public static DaiLiInterface getInstance(){
        return daiLiInterface;
    }
    @Test
    public void test(){
        DynamicDaiLI dynamicDaiLI=new DynamicDaiLI();
        dynamicDaiLI.newProxyInstance(new Facade2());
        DynamicDaiLI.getInstance().set();
        DynamicDaiLI.getInstance().get();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值