裝飾者模式能夠動態添加代碼功能,利用委託機制,服用各個組件,在運行時能夠將這些組件進行疊
加造成一個超級對象,使其擁有全部組件的功能。java
適用於經過單一組件實現複雜功能的場景,須要將功能組件和性能組件分離,彼此互不影響,並在需
要的時候有機的結合起來。裝飾者模式能夠有效的分離性能組件和功能組件,從而提高模塊的可維護
性並增長模塊的複用性。app
裝飾者模式分爲裝飾者(Decorator)、具體裝飾者、組件接口、具體組件四部分,實例以下:
1.組件接口ide
public interface IUserCreator{ /* * 定義組件統計的接口 */ public String createUser(); }
2.具體組件(核心組件)性能
public class UserBaseInfoCreator implements IUserCreator{ @Override public String createUser() { StringBuilder info = new StringBuilder("-----User Base Info-----\r\n"); info.append("name:").append("zhangsan").append("\r\n"); info.append("sex:").append("male").append("\r\n"); info.append("age:").append("25").append("\r\n"); return info.toString(); } }
3.裝飾者(Decorator)測試
public abstract class UserCreator implements IUserCreator{ //component被裝飾對象 IUserCreator component = null; public UserCreator(IUserCreator c) { this.component = c; } }
4.具體裝飾者
ui
public class UserLocationCreator extends UserCreator{ //給被裝飾者添加位置信息裝飾 public UserLocationCreator(IUserCreator c) { super(c); } @Override public String createUser() { StringBuilder info = new StringBuilder(this.component.createUser()); info.append("-----User Location Info-----\r\n"); info.append("location:").append("北京市朝陽區").append("\r\n"); info.append("location NO.:").append("010").append("\r\n"); return info.toString(); } }
public class UserJobCreator extends UserCreator{ //給被裝飾者添加工做信息裝飾 public UserJobCreator(IUserCreator c) { super(c); } @Override public String createUser() { StringBuilder info = new StringBuilder(this.component.createUser()); info.append("-----User Job Info-----\r\n"); info.append("job:").append("software developer").append("\r\n"); info.append("company:").append("TENCENT").append("\r\n"); info.append("workAge:").append("5").append("\r\n"); return info.toString(); } }
經過裝飾組件能夠輕鬆的裝飾核心組件UserBaseInfo的功能,能夠隨意調整核心組件的特性。
public class DecoratorTest{ @Test public void decoratorTest(){ /* * 組裝用戶詳細信息 */ IUserCreator user = new UserJobCreator(new UserLocationCreator(new UserBaseInfoCreator())); System.out.println(user.createUser()); } @Test public void decoratorJobTest(){ /* * 組裝用戶基本信息和工做信息 */ IUserCreator user = new UserJobCreator(new UserBaseInfoCreator()); System.out.println(user.createUser()); } @Test public void decoratorLocTest(){ /* * 組裝用戶基本信息和位置信息 */ IUserCreator user = new UserLocationCreator(new UserBaseInfoCreator()); System.out.println(user.createUser()); } }
JDK中不少地方用到裝飾者模式,最典型的就是IO流的操做,以下:
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("D:\\a.txt")));
//不添加緩衝功能的流對象
//DataOutputStream out = new DataOutputStream(new FileOutputStream("D:\\a.txt"));
以上代碼是裝飾者模式的典型應用,經過嵌套的方式不斷的將對象聚合起來,最終造成一個超級對象,並
使之擁有全部相關對象的功能。其中BufferedOutputStream是性能組件,
DataOutputStream是功能組件,經過裝飾者模式很好的將性能組件好功能組件完美分離。
this