一、裝飾者模式
裝飾者模式,在保持原有功能不變的情況下將一個類重新裝飾,使其具有更強大的功能,用一句成語形容“錦上添花”。
類結構:
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);
}
}