设计模式之代理模式

设计模式之代理模式

代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。

应用场景

  1. 远程代理不同地址空间的对象,都当作本地化对象来处理
  2. 控制对象的访问权限。

当遇到一下情况是可以使用代理模式:

  • 想控制对另一个对象的访问
  • 懒加载
  • 控制日志输出
  • 计算对象引用
  • 控制网络链接问题

代理模式模式结构

浴室分为男浴室和女浴室,其中前台判断能够进入浴室的前提是没有皮肤病,如有没有,才让进入浴室。这里的前台就是一个代理,它代理来浴室,用来判断能否进入浴室的权限。这就是代理的作用。

代理模式和装饰者模式比较容易混淆。需要记住的是,两者的功能区别在于,代理模式改变的是对象的职能,控制对象的行为。而装饰者模式是对职能的增加和减少。使用场景上有所不同。

代理模式结构图

代码

代理模式大致能够分为三部分:抽象职能类,代理类,被代理类

第一部分:抽象职能类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// Person 基本信息类 和性别枚举 
public class Person {
private String name ;

private SexEnum sex;
//是否有皮肤病
private int hasSkinDisease;

public Person(String name, SexEnum sex, int hasSkinDisease) {
this.name = name;
this.sex = sex;
this.hasSkinDisease = hasSkinDisease;
}

public String getName() {
return name;
}

public SexEnum getSex() {
return sex;
}

public int getHasSkinDisease() {
return hasSkinDisease;
}
}

public enum SexEnum {
MALE,FEMALE
}

//抽象职能
abstract class BathRoom {
// 去澡堂泡澡
abstract BathRoom enterBathroom(Person person);
}

第二部分:被代理类

1
2
3
4
5
6
7
8
9
10
11
public class MaleBathRoom extends BathRoom {
@Override
public BathRoom enterBathroom(Person p) {
String sexName = "";
if(SexEnum.MALE.equals(p.getSex())){
sexName = SexEnum.MALE.toString();
System.out.println("name : "+ p.getName() +" sex: "+ sexName +" go bath for male !");
}
return this;
}
}

第三部分:代理类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

public class BathRoomProxy extends BathRoom {

BathRoom bathRoom;

public BathRoomProxy(BathRoom bathRoom) {
this.bathRoom = bathRoom;
}

@Override
public BathRoom enterBathroom(Person person) {
if (person.getHasSkinDisease() == 0) {
this.bathRoom.enterBathroom(person);
} else {
System.out.println(person.getName() + " has disease.");
}
return this;
}
}

客户端调用:

1
2
3
4
5
6
7
8
9
public class App {
public static void main(String[] args) {
Person p1 = new Person("1",SexEnum.MALE,0);
Person p2 = new Person("2",SexEnum.MALE,1);

BathRoomProxy bathRoomProxy = new BathRoomProxy(new MaleBathRoom());
bathRoomProxy.enterBathroom(p1).enterBathroom(p2);
}
}

结果:

1
2
name : 1 sex: MALE go bath for male !
2 has disease.
-------------本文结束感谢您的阅读-------------

本文标题:设计模式之代理模式

文章作者:NanYin

发布时间:2019年06月14日 - 12:06

最后更新:2019年08月12日 - 13:08

原始链接:https://nanyiniu.github.io/2019/06/14/2019-06-14-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E4%B9%8B%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。