设计模式之:代理模式
1.静态代理模式
静态代理的概念:例如我们拿一个看电影的步骤用来比拟代理模式,首先我们客户看电影无非两种方式,去电影院看和在手机APP上看,两种浏览方式都达到了静态代理的实现,无非就是用户通过介质去达到访问对象的目的,那么我们举例一个看电影的流程:首先我想看电影,我选择去电影院看,而到了电影院,前台询问我要看什么电影就购买什么样的电影票,好,我们拿到心怡的电影票之后经过电影票上的编号去到对应的放映室,再找到对应的座位,这个时候电影开始播放了,我们看电影的目的达到了对吧,只是我们通过电影院这个媒介了,并且这个媒介给我们提供了一些服务,例如可乐,爆米花,舒适的座椅,温馨的环境,接下来我们将这些步骤用代码来实现:
静态代理代码实现
播放电影需要放映机
//放映机
public interface SheYing {
void shoot();//播放
}
放映机需要对应胶卷播放:
//胶卷
public class JuZu implements SheYing{
public void shoot() {
System.out.println("唐人街电影胶卷已装配");
}
}
电影院将这些笼络到一起实现成一个步骤并提供其余服务
//电影院
public class DianYingYuan {
private JuZu juzu;
//日志文件(提供的服务)
public DianYingYuan(JuZu juzu) {
log("唐人街");
this.juzu = juzu;
}
public JuZu getJuzu() {
return juzu;
}
public void log(String msg){
System.out.println("荧幕开始放映:"+msg+"预告片");
}
public void setJuzu(JuZu juzu) {
this.juzu = juzu;
}
}
观众通过电影院来观看电影
//观众
public class GuanZho {
public static void main(String[] args) {
//创建电影类对象,传递我想看的电影对象
DianYingYuan ying = new DianYingYuan(new JuZu());
ying.getJuzu().shoot();
}
}
最终实现结果:
荧幕开始放映:唐人街预告片
唐人街电影胶卷已装配
只拿一个电影来比例可能还体现不出他的优势劣势在哪,那么我们再新增一个电影类
-
1.创建类
-
public class Film { }
-
2.实现播放接口并写下执行方法体
-
public class Film implements SheYing{ public void shoot() { System.out.println("绿皮书电影胶卷已装配"); } }
-
3.在媒介中添加所需的功能,例如我只添加一个日志功能
-
//电影院(媒介) public class DianYingYuan { private JuZu juzu; private Film film; //日志文件 public DianYingYuan(JuZu juzu) { log("唐人街"); this.juzu = juzu; } public DianYingYuan(Film film){ log("绿皮书"); this.film = film; } public JuZu getJuzu() { return juzu; } public Film getFilm() { return film; } public void log(String msg){ System.out.println("荧幕开始放映:"+msg+"预告片"); } public void setFilm(Film film) { this.film = film; } public void setJuzu(JuZu juzu) { this.juzu = juzu; } }
-
4.观众实现类同样更改
-
//观众 public class GuanZho { public static void main(String[] args) { DianYingYuan ying = new DianYingYuan(new JuZu()); ying.getJuzu().shoot(); System.out.println("----------------------------"); DianYingYuan film = new DianYingYuan(new Film()); film.getFilm().shoot(); } }
-
实现结果:
-
荧幕开始放映:唐人街预告片 唐人街电影胶卷已装配 ---------------------------- 荧幕开始放映:绿皮书预告片 绿皮书电影胶卷已装配
做出总结:
优势:
- 我们可以借助静态代理模式达到不更改原功能代码但对原功能添加功能,例如上述我们添加日志功能,并且我们不借助静态代理前我们通常都是通过server服务层来访问对应的实现,总归来说执行流程取决于编辑好的程序,但我们使用静态代理之后首先一方面,耦合性降低了,用户可以自己来选择要进行的功能
劣势:
- 代码量基本翻倍增长,每次实现一个功能还需要重复实现,维护成本大幅度提升
小结:正因为我们使用静态代理劣势太过明显且繁琐,所以我们才需要借助到:"动态代理"