1. 设计模式分类

设计模式分为三大类:

创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式;

结构型模式:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式;

行为型模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式;

2. 代理模式

代理是基本的设计模式之一,提供额外的或不同的操作,代理通常充当中间人的角色,如果用“租房子”来打比方,代理则是中介,首先要明确的是:不论是静态代理还是动

态代理,被代理对象都要有一个实现的接口

2.1 静态代理

静态代理的本质是:用户调用目标对象的方法是通过代理对象调用的,其中代理对象中实现并组合了目标对象实现的接口,因此可以在代理对象中调用目标对象的方法。

1. 目标对象实现的接口

package cn.huawei.ProxyPattern;
public interface TargetInterface {
void method1();
}

2. 目标对象

package cn.huawei.ProxyPattern;
public class Target implements TargetInterface {
@Override
public void method1() {
System.out.println("STEP3: 睡觉");
}
}

3. 静态代理对象

package cn.huawei.ProxyPattern;
public class StaticProxy implements TargetInterface{
private TargetInterface proxied;
@Override
public void method1() {
System.out.println("STEP1: 洗脸");
System.out.println("STEP2: 刷牙");
proxied.method1();
}
public StaticProxy(TargetInterface proxied) {
this.proxied = proxied;
}
}

4.Main函数

package cn.huawei.ProxyPattern;
public class Main {
public static void fun1(TargetInterface iface){
iface.method1();
}
public static void main(String[] args) {
System.out.println("代理之前:");
fun1(new Target());
System.out.println("代理之后:");
fun1(new StaticProxy(new Target()));
}
}

5.运行结果

代理之前:
STEP3: 睡觉
==========
代理之后:
STEP1: 洗脸
STEP2: 刷牙
STEP3: 睡觉

2.2 动态代理

动态代理的本质和静态代理是不同的,不同点如下:

1. 静态代理需要用户写代理对象StaticTarget,而动态代理是JVM在内存中生成代理对象

2. 动态代理的代理对象是通过反射机制调用目标对象的方法,而静态代理是通过在代理对象中组合目标对象实现的接口来实现调用目标对象方法的功能

3. 动态代理的代理对象和目标对象实现了相同的接口

【参考资料】:Java中的反射机制

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class Main {
public static void main(String[] args) {
FBB fbb = new FBB(); /*
* 参数讲解:
* 1. 被代理对象的类加载器
* 2. 被代理对象实现的接口的字节码数组 // 也可以是 new Class[] { MX.class }
* 3. InvocationHandler
* 4. 返回值要和接口的字节码数组中的接口类型一致
*/
MX proxy = (MX) Proxy.newProxyInstance(MX.class.getClassLoader(), fbb.getClass().getInterfaces(), new InvocationHandler() {
/*
* InvocationHandler可以理解为一组规范,代理对象proxy调用目标对象几次方法,该方法就执行几次
* invoke:执行代理对象的方法
* proxy:代理对象
* method:目标对象方法的字节码Method对象,来自FBB中的方法
* args:被代理对象中方法的参数,来自FBB方法中的参数
* @return 返回代理方法的结果
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if ("sing".equals(method.getName())) { //针对唱歌项目,如果加钱可以唱歌曲2
System.out.println("加钱 歌曲2"); //增强方法
Object invoke = method.invoke(fbb, args);
return invoke; //返回sing()结果
} else {
return method.invoke(fbb, args);
}
}
});
System.out.println(proxy.sing());
System.out.println(proxy.dance());
}
} interface MX { //明星接口,默认明星都会唱歌和跳舞
String sing();
String dance();
} class FBB implements MX { //目标对象(被代理对象)
@Override
public String sing() { //FBB默认只会唱歌曲1
return "fbb sing 歌曲1";
} @Override
public String dance() {//FBB默认只会跳舞蹈1
return "fbb dance 舞蹈1 ";
}
}
执行结果
=======
加钱 歌曲2
fbb sing 歌曲1
fbb dance 舞蹈1

【design pattern】代理模式的更多相关文章

  1. Thinking In Design Pattern——MVP模式演绎

    原文<Thinking In Design Pattern——MVP模式演绎>不知为何丢失了,故重新整理了一遍. 目录 What Is MVP Domain Model StubRepos ...

  2. proxy pattern 代理模式

    常用的几种代理模式简要说明如下:  (1) 远程代理(Remote Proxy):为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远 ...

  3. Proxy Design Pattern 代理设计模式

    代理设计模式.此模式是用于serverclient排序.互联网接入,也经常使用的类代理,我觉得这种感觉很复杂.但是,这种设计模式本身是非常easy的. 是一类调用另一个类的功能.客户调用类,实际工作是 ...

  4. Design Pattern - 命令模式

    一般执行一个操作的过程, 创建对象, 并调用对象的函数, 函数执行, 返回 比如下面的类图, client直接调用Receiver.action 而命令模式, 抽象出command对象, 并在comm ...

  5. Design Pattern - 访问者模式

    访问者模式 访问者模式(Visitor), 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 这个模式相对比较复杂, 而又很少能被用上, 拿G ...

  6. js设计模式系列之(一)请节约你的请求-代理模式

    What’s the proxy pattern? 代理模式其实就是将违反单一性原则的类给抽离出来,尽量满足开放和封闭的原则. 相当于一个类的行为只是一种,但是你可以给这个类添加额外的行为.比如: 一 ...

  7. 深入浅出设计模式——代理模式(Proxy Pattern)

    模式动机在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用.代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到 ...

  8. NET设计模式 第二部分 结构性模式(13):代理模式(Proxy Pattern)

    代理模式(Proxy Pattern) ——.NET设计模式系列之十四 Terrylee,2006年5月 摘要:在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对 ...

  9. 代理模式(Proxy pattern)

    代理模式(proxy pattern):作用:为其他对象提供一种代理,以控制对这个对象的访问.代理对象在客户端对象和目标对象之间起中介的作用. 代理模式涉及到的角色: 抽象角色:声明真实对象和代理对象 ...

随机推荐

  1. 使用 MongoDB 存储商品分类信息

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 这是一篇MongoDB官网上的一篇文章,分析了使用MongoDB存储商品分类信息相比其他数据库的优势,并讲述 ...

  2. bzoj 4069: [Apio2015]巴厘岛的雕塑【dp】

    居然要对不同的数据写不同的dp= = 首先记得开long long,<<的时候要写成1ll<<bt 根据or的性质,总体思路是从大到小枚举答案的每一位,看是否能为0. 首先对于 ...

  3. 51nod 1222 最小公倍数计数【莫比乌斯反演】

    参考:https://www.cnblogs.com/SilverNebula/p/7045199.html 所是反演其实反演作用不大,又是一道做起来感觉诡异的题 转成前缀和相减的形式 \[ \sum ...

  4. 《windows核心编程系列》四谈谈进程的建立和终止

    第二部分:工作机理 第一章:进程 上一章介绍了内核对象,这一节开始就要不断接触各种内核对象了.首先要给大家介绍的是进程内核对象.进程大家都不陌生,它是资源和分配的基本单位,而进程内核对象就是与进程相关 ...

  5. [AHOI2007]密码箱

    Description 在一次偶然的情况下,小可可得到了一个密码箱,听说里面藏着一份古代流传下来的藏宝图,只要能破解密码就能打开箱子,而箱子背面刻着的古代图标,就是对密码的提示.经过艰苦的破译,小可可 ...

  6. [SHOI2002]舞会

    Descriptio 某学校要召开一个舞会,已知有N名学生,有些学生曾经互相跳过舞.当然跳过舞的一定是一个男生和一个女生,在这个舞会上,要求被邀请的学生中任一对男生和女生互相都不能跳过舞.问最多可邀请 ...

  7. 二分查找+数学 HDOJ 4342 History repeat itself

    题目传送门 题意:计算从1开始到第n个非完全平方数的开方和 分析:设第n个非完全平方数的值为a,x * x < a < (x+1) * (x+1),而且易得(tmp = sqrt (a) ...

  8. 223 Rectangle Area 矩形面积

    在二维平面上计算出两个由直线构成的矩形叠加覆盖后的面积. 假设面积不会超出int的范围. 详见:https://leetcode.com/problems/rectangle-area/descrip ...

  9. Java8-Lomda表达式

    Lomda表达式 /** * All rights Reserved, Designed By www.bingo.com * @Title TestLamda.java * @author yang ...

  10. CF949A/950C Zebras

    思路: 贪心乱搞. 实现: #include <bits/stdc++.h> using namespace std; vector<vector<int>> v; ...