代理设计模式和单例设计模式

代理模式是为某个对象提供一个代理对象,并且由代理对象控制对原对象的访问。俗称中介,例如房产中介这种。

举个例子:我想要向你租房子,但是我现在没有时间,我在做我自己的事情,同时我还要考虑很多问题,交通便不便利,上下班放不方便等等。所以我就委托一个中介来帮我看房子。我们两个不用见面,同时不影响我的事情,就可以把事情办好。

好处:就是尽量隐藏自己,并且能对目标方法进行加强。

想要代理一个对象就要和代理对象有相同的行为,那么就要实现同一个接口。

一 静态代理:自己写代理对象

举个例子:例如潘金莲和西门庆,潘和西一定不能明晃晃的见面,那么就一定要有一个人来替他们传递信息--->王婆,那么就可以来实现。王婆就是代理对象

(1)接口

(2)委托人 潘金莲

 

(3)中介 王婆 注意:构造器中的接口为参数 是使用了接口的多态

 (4)接收人 西门庆

二 动态代理:jdk自动生成对象 利用反射技术:对类进行剖析

还是要有接口 委托人 和 接收人

package DaiLi;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//写一遍动态代理
public class XMP {
    public static void main(String[] args) {
        //1 你要找谁
        IN pan=new PAN();
        IN li=new LI();

        //自动生成代理对象   必须要有接口
        /*
        * k1:被代理对象的类加载器
        * k2:被代理对象的行为 类对象的方法
        * k3:具体策略
        * */

        //动态代理用很多的次数
        IN o=(IN)Proxy.newProxyInstance(pan.getClass().getClassLoader(),pan.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        int a=(int)method.invoke(pan,args);
                        //method.invoke(li,args);
                        method.invoke(li);
                        return a;
                    }
                });
        int eat =o.eat(22);
        System.out.println(eat);
    }
}

 在main主函数中 

(1)首先要先声明是谁--->委托人是谁

(2)使用JDK自己的代理对象,调用Proxy.newProxyInstance函数有三个参数

pan.getClass().getClassLoader(),被代理对象的类加载器
,pan.getClass().getInterfaces(),被代理对象的行为 类对象的方法 利用反射 获取到接口中实现的方法
new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                method.invoke(pan);//利用反射 将对象传进去,如果有参数把args加进去,如下
                //method.invoke(li,args);
                method.invoke(li);
                //调用同一个方法 有返回值的和无返回值的方法不能一起调用
                return null;//可以有返回值 利用多态中的强转
            }
        });

 

单例设计模式:保证在应用中只有一个对象就行了。

(1) 创建私有 静态对象

(2)构造方法为私有

(3)创建获取对象方法

分为懒汉式

// 懒汉式
public  class User{
private static User user =new User();
private User(){};
public static User getUser(){
   return user;
}
}

饿汉式

// 饿汉式
public  class User{
private static User user =null;
private User(){};
public static User getUser(){
    if(user ==null){
      user =new User();
      return user;
    }
   return user;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值