裝飾者模式&代理模式

一、裝飾者模式

裝飾者模式,在保持原有功能不變的情況下將一個類重新裝飾,使其具有更強大的功能,用一句成語形容“錦上添花”。

類結構:


Component:抽象組件,定義了一組抽象的接口,指定了被裝飾的組件都有哪些功能。

ComponentImpl:抽象組件實現類,完成了基本的功能實現

Decorator:裝飾器角色,持有Component的實例引用,有點遞歸的感覺。


僞代碼:

Component c=new ComponentImpl();
Decorator d1=new Decorator();
d1.setComponent(c);
Decorator d2=new Decorator();
d2.setComponent(d1);
Decorator d3=new Decorator();
d3.setComponent(d2);
Decorator d4=new Decorator();
d4.setComponent(d3);
d4.methodA();

裝飾者模式和適配器模式有點類似,都是包裝(wrapper)了一個類,但目地卻不相同。適配器模式是將一個接口轉換成另一個接口,從而達成匹配。而裝飾者模式並沒有改變原來的接口,而是改變原有對象的處理方法,藉助遞歸提升性能。


二、代理模式

代理模式,爲其它對象提供一種代理以控制對這個對象的訪問。

類結構圖:



Subject:接口類,定義了一些需要代理的接口方法

RealSubject:具體的實現類

ProxySubject:代理類,保存一個Subject引用,可以注入一個具體的子類比如RealSubject。


代理模式其實就是在操作對象時引入一定程度的間接性。這種間接性,可以增加很多附加操作。比如權限控制,參數校驗等等


接口類

/**
 * 個人信息管理
 * @author onlyone 
 */
public interface PersonManager {

    /**
     * 查詢工資
     * @param name 被查人的名字
     * @param operateName 操作人名字
     */
    public double getSalary(String name,String operateName);
}

具體實現類

/**
 * 具體的實現類
 * 
 * @author onlyone
 */
public class RealPersonManager implements PersonManager {

    @Override
    public double getSalary(String name, String operateName) {

        // 查詢數據庫,返回具體的工資數
        return 1000000;
    }

}

代理類

/**
 * 代理類
 * 
 * @author onlyone
 */
public class ProxyPersonManager implements PersonManager {

    // 接口引用
    PersonManager realPersonManager = new RealPersonManager();

    @Override
    public double getSalary(String name, String operateName) {

        // 1. 增加一些的權限判斷。比如操作人是否有查詢某人工資的權限
        // 2. 具體類的調用
        return realPersonManager.getSalary(name, operateName);
    }

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章