Java設計模式之004--代理模式

代理模式(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);    }}
相關文章
相關標籤/搜索