设计模式-代理模式,修饰模式

代理模式:

     静态代理->将需要代理的类交给代理类处理,代理类做一些自己的业务处理.比如:对接口的调用限制,添加描述等

     动态代理->如果代理的是接口的话使用jdk自带的代理。

修饰模式:

      对方法的一些描述修饰。

准备接口与类:

/**
 * Created by h on 2019/3/14.
 */
public interface Person {
    String asy();
    String eat();
}

 

package com.designPattern.pojo;

import com.designPattern.api.Person;

/**
 * Created by h on 2019/3/14.
 */
public class ManPerson implements Person,Cloneable{

    @Override
    public String asy() {
        return "男生讲话啦";
    }

    @Override
    public String eat() {
        return "男生吃东西啦";
    }

    /**
     * 原型模式
     * @return
     * @throws CloneNotSupportedException
     */
    @Override
    public Object clone() throws CloneNotSupportedException {
        ManPerson clone = (ManPerson) super.clone();
        return clone;
    }
}

 静态代理实现:

package com.designPattern.service;

import com.designPattern.api.Person;
import com.designPattern.pojo.ManPerson;

/**
 * 代理模式-静态代理
 * Created by h on 2019/3/18.
 */
public class PersonProxyStatic implements Person {
    private Person person;

    public PersonProxyStatic(Person person) {
        this.person = person;
    }

    public void before(){
        System.out.println("静态代理-before:");
    }
    public void after(){
        System.out.println("静态代理-after:");
    }
    @Override
    public String asy() {
        // 装饰模式-装饰接口
        before();
        String asy = person.asy();
        after();
        return asy;
    }

    @Override
    public String eat() {
        // 装饰模式-装饰接口
        before();
        String eat = person.eat();
        after();
        return eat;
    }

}

 动态代理实现:(不用对每个接口都做相同的操作)

package com.designPattern.service;

import com.designPattern.api.Person;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 代理模式-动态代理
 * Created by h on 2019/3/18.
 */
public class PersonProxyDynamic implements InvocationHandler {

    private Object object;

    public PersonProxyDynamic(Person person) {
        this.object = person;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 修饰模式-修饰接口
        System.out.println("动态代理-before:");
        Object invoke = method.invoke(object, args);
        System.out.println("动态代理-after:");
        return invoke;
    }
}

 测试:


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * 代理模式and装饰模式
 * Created by h on 2019/3/18.
 */
public class ProxyAndModifyTest {
    public static void main(String[] args) {
        // 动态代理
        Person person = new ManPerson();
        InvocationHandler handler = new PersonProxyDynamic(person);
        Person personProxyDynamic = (Person)Proxy.newProxyInstance(
                handler.getClass().getClassLoader(),
                person.getClass().getInterfaces(), handler);
        System.out.println("动态代理:" + personProxyDynamic.eat());
        // 静态代理
        PersonProxyStatic personProxyStatic = new PersonProxyStatic(person);
        System.out.println("静态代理:" + personProxyStatic.eat());
    }
}

打印结果:

动态代理-before:
动态代理-after:
动态代理:男生吃东西啦
静态代理-before:
静态代理-after:
静态代理:男生吃东西啦

    若有理解不到位的地方希望大家能够指点一下,也避免让别人犯错。非常感谢!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值