代理模式定义如下:
其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式的三种角色:
抽象角色(一般采用抽象类或者接口)
真实角色(抽象角色的具体实现,具体实现)
代理角色(具体对外干活的)
场景概述如下:
图书包括图书名称和出版社,但是我们在获取这两个值的时候都会事先知道他的价格,当获取其两个属性之后我们会考虑是否阅读。
Java静态代理的实现:
抽象角色:
public interface IBook { String getBookName(); String getBookPress();}
实现角色:
public class JavaBook implements IBook { @Override public String getBookName() { return "Java 程序设计"; } @Override public String getBookPress() { return "上海科学出版社"; }}
代理角色:
public class ProxyBook implements IBook { private IBook book = null; public ProxyBook(IBook book) { super(); this.book = book; } @Override public String getBookName() { System.out.println("获取图书价格成功"); String bookName = book.getBookName(); System.out.println("后续可以阅读"); return bookName; } @Override public String getBookPress() { System.out.println("获取图书价格成功"); String bookPress = book.getBookPress(); System.out.println("后续可以阅读"); return bookPress; }}
测试代码:
public static void main(String[] args) { IBook book = new ProxyBook(new JavaBook()); book.getBookName(); book.getBookPress();}
发现问题:
1.抽象角色的行为发生变化的时候就需要重新写代理类的实现了