代理模式(Proxy) : 爲其餘對象提供一種代理以控制對這個對象的訪問。
代理模式說白了就是「真實對象」 的表明, 在訪問對象時引入必定程度的間接性, 由於這種間接性能夠附加多種用途。
數據庫
舉例說明:操做員查詢銷售訂單功能, 爲了提升查詢性能, 咱們接入緩存功能, 若是緩存中有數據, 那麼直接返回緩存中的數據,;若是緩存中沒有數據, 那麼查詢訂單數據後, 把數據加入到緩存, 這樣在下次查詢訂單數據時, 就能夠從緩存中讀取了。 緩存
a.建立訂單類、模擬的數據庫類、模擬的緩存類;ide
//模擬的數據庫類:提供getOrder方法來經過oid查詢訂單信息
public class DB {
private static List<Order> list = new ArrayList<>();
static{
list.add(new Order(1,"毛巾3條",45,"2020-2-1"));
list.add(new Order(2,"小紙巾10包",12,"2020-1-21"));
list.add(new Order(3,"洗髮水1瓶",32,"2020-1-30"));
list.add(new Order(4,"紅牛1箱",36,"2020-2-2"));
list.add(new Order(5,"哈脾2箱",120,"2020-2-3"));
}
public Order getOrder(int oid){
System.out.println("從數據庫中查找數據...");
for(Order order:list){
if(order.getOid() == oid){
return order;
}
}
return null;
}
}
//模擬的緩存類:提供getCache方法來經過oid查詢訂單信息; 提供putCache方法將訂單信息存放到緩存中;
public class Cache {
private Map<Integer,Order> map = new HashMap();
private volatile static Cache cache;
private Cache(){
}
//雙檢 + 單例模式
public static Cache getInstance(){
if (cache == null){
synchronized (Cache.class){
if (cache == null){
cache = new Cache();
}
}
}
return cache;
}
//把訂單添加到緩存中
public void putCache(int key, Order value){
System.out.println("把訂單數據添加到緩存中...");
map.put(key,value);
}
//從緩存中獲取訂單
public Order getCache(int key){
System.out.println("從緩存中查詢訂單數據...");
return map.get(key);
}
}
b.定義業務類(被代理的對象類)接口,以供業務類和代理類去實現性能
public interface OrderDao {
public Order queryOrder(int oid);
}
c.定義業務類、代理類實現業務類(被代理的對象類)接口測試
public class OrderDaoImpl implements OrderDao {
@Override
public Order queryOrder(int oid) {
DB db = new DB();
Order order = db.getOrder(oid);
return order;
}
}
public class OrderProxy implements OrderDao {
private OrderDao target; //目標對象(被代理的對象)
public OrderProxy (OrderDao target){
this.target = target;
}
@Override
public Order queryOrder(int oid) {
Cache cache = Cache.getInstance();
Order order = cache.getCache(oid); //從緩存中查訂單(代理作了被代理對象額外的業務)
if (null == order){
order = target.queryOrder(oid); //從數據庫中查訂單(被代理對象的業務,方法名相同)
cache.putCache(order.getOid(),order); //把訂單放入緩存中
}
return order;
}
}
測試對比:this
public class Test { public static void main(String[] args) { OrderDaoImpl odi = new OrderDaoImpl(); Order order = odi.queryOrder(2); //實際調用的是db.getOrder(oid) System.out.println(order); System.out.println("-------------------"); //查緩存 OrderProxy orderProxy = new OrderProxy(odi); Order order1 = orderProxy.queryOrder(2); System.out.println(order1); System.out.println("----------第二次查詢---------"); Order order2 = orderProxy.queryOrder(2); System.out.println(order2); }}