1. 程式人生 > 實用技巧 >只有被測APK時執行Robotium測試專案Logcat報錯“Could not find class 'com.jayway.android.robotium.solo.Solo'&...

只有被測APK時執行Robotium測試專案Logcat報錯“Could not find class 'com.jayway.android.robotium.solo.Solo'&...

裝飾者模式

一、簡介

裝飾模式使用一種對客戶端透明的方式來動態的擴充套件物件的功能,同時它也是繼承關係的一種代替方案。

定義:動態地給一個物件新增一些額外的職責,就增加功能來說裝飾模式相比生成子類更加靈活。

二、使用場景

需要透明且動態的擴充套件類的功能時。

三、簡單實現

這裡以房間裝飾為例簡單的實現裝飾模式,我們知道一間屋子最什麼都不裝飾會顯得空蕩無趣,所以大家總會用一些傢俱、桌布等裝飾房間。

    //抽象房屋類
    public abstract class Room{
        public abstract void decorator();
    }

    public class EmptyRoom extends Room{

        @Override
        public void decorator() {
            Log.i(TAG, "simple decorator room ");
        }
    }
    //抽象裝飾類
    public abstract class DecoratorRoom extends Room{
        private Room room;

        public DecoratorRoom(Room room) {
            this.room = room;
        }

        @Override
        public void decorator() {
        room.decorator();
        }
    }

    //具體裝飾類
    public class BedRoom extends DecoratorRoom{

        public BedRoom(Room room) {
            super(room);
        }

        @Override
        public void decorator() {
            super.decorator();
            bed();
        }

        private void bed(){
            Log.i(TAG, "put a bed:");
        }
    }

    public class LivingRoom extends DecoratorRoom{

        public LivingRoom(Room room) {
            super(room);
        }

        @Override
        public void decorator() {
            super.decorator();
            sofa();
        }

        private void sofa(){
            Log.i(TAG, "put a sofa: ");
        }
    }
    
    public void test(){
        EmptyRoom emptyRoom=new EmptyRoom();
        
        BedRoom bedRoom=new BedRoom(emptyRoom);
        bedRoom.decorator();
        
        LivingRoom livingRoom=new LivingRoom(emptyRoom);
        livingRoom.decorator();
    }

四、小結

在Android中使用裝飾者模式的例子就是Context,我們知道activity、application等都繼承了Context,實際上他們就是Context的裝飾類。Context是一個抽象類自定義了相關操作並未實現,真正的實現類是ContextImpl,所以這裡的Context相當於上面例子的Room而ContextImpl相當於EmptyRoom。再來說Activity,它繼承自ContextThemeWrapper,ContextThemeWrapper又繼承自ContextWrapper,ContextWrapper繼承自Context,這裡的ContextWrapper就相當於裝飾者抽象類,其子類Activity相當於具體的裝飾類。

通過學習我們發現裝飾者模式和代理模式有點類似,但是它們是有區別的:

  • 代理模式只對代理的物件施加控制並不會對物件本身的功能進行增強
  • 裝飾模式是以對客戶端透明的方式擴充套件物件功能已達到對物件的增強,它也是繼承關係的一個替代方案