代理模式的本質:控制對象訪問
模式定義:爲其他對象提供一種代理以控制對這個對象的訪問。
1 虛代理:根據需要來創建開銷很大的對象,改對象值有在需要的時候纔會被真正創建。
package com;
public interface UserModelApi {
public String getUserId();
public void setUserId(String userId);
public String getName();
public void setName(String name);
public String getDepId();
public void setDepId(String depId);
public String getSex();
public void setSex(String sex);
public String getId();
public void setId(String id);
}
package com.impl;
import com.UserModelApi;
public class UserModel implements UserModelApi{
private String userId;
private String name;
private String depId;
private String sex;
private String id;
@Override
public String getUserId() {
return userId;
}
@Override
public void setUserId(String userId) {
this.userId = userId;
}
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public String getDepId() {
return depId;
}
@Override
public void setDepId(String depId) {
this.depId = depId;
}
@Override
public String getSex() {
return sex;
}
@Override
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String getId() {
return id;
}
@Override
public void setId(String id) {
this.id = id;
}
}
package com.impl;
import com.UserModelApi;
public class Proxy implements UserModelApi {
private UserModel realSubject = null;
private boolean loaded = false;
public Proxy(UserModel realSubject) {
this.realSubject = realSubject;
}
@Override
public String getUserId() {
return realSubject.getUserId();
}
@Override
public String getName() {
return realSubject.getName();
}
@Override
public String getDepId() {
return realSubject.getDepId();
}
@Override
public String getSex() {
if (!loaded) {
reload();
loaded = true;
}
return realSubject.getSex();
}
@Override
public String getId() {
if (!loaded) {
reload();
loaded = true;
}
return realSubject.getId();
}
@Override
public void setDepId(String depId) {
realSubject.setDepId(depId);
}
@Override
public void setName(String name) {
realSubject.setName(name);
}
@Override
public void setSex(String sex) {
realSubject.setSex(sex);
}
@Override
public void setUserId(String userId) {
realSubject.setUserId(userId);
}
@Override
public void setId(String id) {
realSubject.setId(id);
}
private void reload() {
// 模擬數據庫查詢過程,字段很多時更有價值
System.out.println("reload~~~~");
this.setSex("男");
this.setId("210782XXXXXXXX1234");
}
public void showSimpleInfo() {
System.out.println("DepId = " + this.getDepId() + ",UserId = "
+ this.getUserId() + ",name = " + this.getName());
}
public void showAllInfo() {
System.out.println("DepId = " + this.getDepId() + ",UserId = "
+ this.getUserId() + ",Name = " + this.getName() + ",Sex = "
+ this.getSex() + ",Id = " + this.getId());
}
}
package com;
import java.util.ArrayList;
import java.util.List;
import com.impl.Proxy;
import com.impl.UserModel;
public class UserManager {
public List getUsersByDepId(String depId){
List usersList = new ArrayList();
//模擬數據庫查詢過程,只初始化depId,userId,name
Proxy userModel1 = new Proxy(new UserModel());
userModel1.setDepId("0103");
userModel1.setUserId("0103001");
userModel1.setName("SHIXIN747");
usersList.add(userModel1);
Proxy userModel2 = new Proxy(new UserModel());
userModel2.setDepId("0103");
userModel2.setUserId("0103002");
userModel2.setName("AXUE630");
usersList.add(userModel2);
Proxy userModel3 = new Proxy(new UserModel());
userModel3.setDepId("0103");
userModel3.setUserId("0103003");
userModel3.setName("YUANJIA258");
usersList.add(userModel3);
return usersList;
}
}
import java.util.List;
import com.UserManager;
import com.impl.Proxy;
public class Client {
public static void main(String[] args) {
UserManager userManager = new UserManager();
List<Proxy> usersList = userManager.getUsersByDepId("0103");
for(Proxy userproxy : usersList){
userproxy.showSimpleInfo();
}
for(Proxy userproxy : usersList){
userproxy.showAllInfo();
}
}
}
2 保護代理:控制對原始對象的訪問,如果有需要,可以給不同的用戶提供不同的訪問權限,以控制他們對原始對象的訪問。
package com;
public interface OrderApi {
String getProductName();
void setProductName(String productName,String user);//此處參數不得不加了個user
int getOrderNum();
void setOrderNum(int orderNum,String user);//此處參數不得不加了個user
String getOrderUser();
void setOrderUser(String orderUser,String user);//此處參數不得不加了個user
}
package com.impl;
import com.OrderApi;
public class Order implements OrderApi{
private String productName;
private int orderNum;
private String orderUser;
public Order(String productName, int orderNum, String orderUser) {
super();
this.productName = productName;
this.orderNum = orderNum;
this.orderUser = orderUser;
}
@Override
public String getProductName() {
return productName;
}
@Override
public void setProductName(String productName,String user) {
this.productName = productName;
}
@Override
public int getOrderNum() {
return orderNum;
}
@Override
public void setOrderNum(int orderNum,String user) {
this.orderNum = orderNum;
}
@Override
public String getOrderUser() {
return orderUser;
}
@Override
public void setOrderUser(String orderUser,String user) {
this.orderUser = orderUser;
}
}
package com.impl;
import com.OrderApi;
public class OrderProxy implements OrderApi {
private Order order = null;
public OrderProxy(Order order) {
this.order = order;
}
public int getOrderNum() {
return order.getOrderNum();
}
@Override
public String getOrderUser() {
return order.getOrderUser();
}
@Override
public String getProductName() {
return order.getProductName();
}
@Override
public void setOrderNum(int orderNum, String user) {
if (user.equals(order.getOrderUser())) {
order.setOrderNum(orderNum, user);
} else {
System.out.println("對不起,您無權限進行此操作");
}
}
@Override
public void setOrderUser(String orderUser, String user) {
if (user.equals(order.getOrderUser())) {
order.setOrderUser(orderUser, user);
} else {
System.out.println("對不起,您無權限進行此操作");
}
}
@Override
public void setProductName(String productName, String user) {
if (user.equals(order.getOrderUser())) {
order.setProductName(productName, user);
} else {
System.out.println("對不起,您無權限進行此操作");
}
}
public String toString() {
return "productName = " + this.getProductName() + ",orderUser = "
+ this.getOrderUser() + ",orderNum = " + this.getOrderNum();
}
}
import com.OrderApi;
import com.impl.Order;
import com.impl.OrderProxy;
public class Client {
public static void main(String[] args) {
OrderApi order = new OrderProxy(new Order("寶馬",5,"SHIXIN747"));
System.out.println(order);
order.setOrderNum(10, "AXUE630");
order.setOrderNum(10, "SHIXIN747");
System.out.println(order);
}
}
3 Java的動態代理
package com;
public interface OrderApi {
String getProductName();
void setProductName(String productName,String user);//此處參數不得不加了個user
int getOrderNum();
void setOrderNum(int orderNum,String user);//此處參數不得不加了個user
String getOrderUser();
void setOrderUser(String orderUser,String user);//此處參數不得不加了個user
}
package com.impl;
import com.OrderApi;
public class Order implements OrderApi{
private String productName;
private int orderNum;
private String orderUser;
public Order(String productName, int orderNum, String orderUser) {
super();
this.productName = productName;
this.orderNum = orderNum;
this.orderUser = orderUser;
}
@Override
public String getProductName() {
return productName;
}
@Override
public void setProductName(String productName,String user) {
this.productName = productName;
}
@Override
public int getOrderNum() {
return orderNum;
}
@Override
public void setOrderNum(int orderNum,String user) {
this.orderNum = orderNum;
}
@Override
public String getOrderUser() {
return orderUser;
}
@Override
public void setOrderUser(String orderUser,String user) {
this.orderUser = orderUser;
}
public String toString() {
return "productName = " + this.getProductName() + ",orderUser = "
+ this.getOrderUser() + ",orderNum = " + this.getOrderNum();
}
}
package com.impl;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.OrderApi;
public class DynamicProxy implements InvocationHandler {
private Order order = null;
public OrderApi getProxyInterface(Order order) {
// 設置被代理的對象,好方便invoke裏面的操作
this.order = order;
// 把真正的訂單對象和動態代理關聯起來
OrderApi orderApi = (OrderApi) Proxy.newProxyInstance(order.getClass()
.getClassLoader(), order.getClass().getInterfaces(), this);
return orderApi;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//如果是調用setter方法就需要檢查權限
if(method.getName().startsWith("set")){
if(order.getOrderUser() != null && order.getOrderUser().equals(args[1])){
return method.invoke(order, args);
}else{
System.out.println("對不起," + args[1] + ",你無權修改本訂單的數據");
}
}else{
return method.invoke(order, args);
}
return null;
}
}
import com.OrderApi;
import com.impl.DynamicProxy;
import com.impl.Order;
public class Client {
public static void main(String[] args) {
DynamicProxy DynamicProxy = new DynamicProxy();
Order order = new Order("奔馳",20,"SHIXIN747");
System.out.println(order);
OrderApi orderApi = DynamicProxy.getProxyInterface(order);
orderApi.setOrderNum(30, "AXUE630");
orderApi.setOrderNum(30, "SHIXIN747");
System.out.println(order);
}
}