設計模式(裝飾者模式)

1、簡介

裝飾者模式能夠動態添加代碼功能,利用委託機制,服用各個組件,在運行時能夠將這些組件進行疊

加造成一個超級對象,使其擁有全部組件的功能。java

2、使用場景及優勢

適用於經過單一組件實現複雜功能的場景,須要將功能組件和性能組件分離,彼此互不影響,並在需

要的時候有機的結合起來。裝飾者模式能夠有效的分離性能組件和功能組件,從而提高模塊的可維護
性並增長模塊的複用性。app

3、常見表現形式

裝飾者模式分爲裝飾者(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();
    }
}

4、測試

經過裝飾組件能夠輕鬆的裝飾核心組件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());
    }
}

 

5、裝飾者模式在JDK中的運用

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

相關文章
相關標籤/搜索