天天看點

裝飾模式

《大話設計模式》閱讀筆記和總結。原書是C#編寫的,本人用Java實作了一遍,包括每種設計模式的UML圖實作和示例代碼實作。

目錄:

設計模式 Github位址: DesignPattern

說明

定義:裝飾模式(Decorator)動态地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。

UML圖:

裝飾模式

裝飾模式UML圖.png

代碼實作:

Component類

abstract class Component {
    public abstract void operation();
}
           

ConcreteComponent類

class ConcreteComponent extends Component{

    @Override
    public void operation() {
        System.out.println("具體對象的操作");
    }
}
           

Decorator類

abstract class Decorator extends Component{
    protected Component component;

    public void setComponent(Component component) {
        this.component = component;
    }

    @Override
    public void operation() {
        // 重寫operation(),實際上執行的是Component的operation()
        if (component!=null){
            component.operation();
        }
    }
}

           

ConcreteDecorator 具體實作類

class ConcreteDecoratorA extends Decorator{

    //本類的獨有功能,以差別于ConcreteDecoratorB
    private String addedState;
    @Override
    public void operation() {
        super.operation();
        addedState = "New State";
        System.out.println("具體裝飾對象A的操作");
    }
}

class ConcreteDecoratorB extends Decorator{

    @Override
    public void operation() {
        super.operation();
        AddBehavior();
        System.out.println("具體裝飾對象B的操作");
    }

    //本類的獨有方法,以差別于ConcreteDecoratorA
    private void AddBehavior(){

    }
}
           

用戶端代碼

public class DecoratorPattern {
    public static void main(String[] args){
        ConcreteComponent c = new ConcreteComponent();
        ConcreteDecoratorA d1 = new ConcreteDecoratorA();
        ConcreteDecoratorB d2 = new ConcreteDecoratorB();

        /*
        裝飾的方法是:首先用ConcreteComponent執行個體化對象c,然後用
        ConcreteDecoratorA的執行個體化對象d1來包裝c,再用ConcreteDecoratorB
        的對象d2包裝d1,最終執行d2的operation()
         */
        d1.setComponent(c);
        d2.setComponent(d1);
        d2.operation();
    }
}
           

運作結果

具體對象的操作
具體裝飾對象A的操作
具體裝飾對象B的操作
           

示例

例子:之前玩QQ空間的時候,總會裝扮空間,打扮形象,可以給qq的角色搭配各種衣服。用程式模拟這個裝扮的過程。

裝飾模式

裝飾模式示例UML圖.png

People類,ConcreteComponent

public class People extends Component{

    public People(){}
    private String name;

    public People(String name) {
        this.name = name;
    }

    @Override
    public void operation() {
        System.out.println("裝飾的是"+name);
    }
}
           

服飾類 Decorator

public class Finery extends People {

    protected People component;
    
    //打扮
    public void Decorate(People component) {
        this.component = component;
    }

    @Override
    public void operation() {
        if (component!=null){
            component.operation();
        }
    }
}
           

具體服飾類-T恤 ConcrteFecorator

public class TShirts extends Finery {

    @Override
    public void operation() {
        System.out.print("TShirts");
        super.operation();
    }
}
           

具體服飾類-垮褲 ConcrteFecorator

public class BigTrouser extends Finery {

    @Override
    public void operation() {
        System.out.print("垮褲");
        super.operation();
    }
}
           
public class Main {
    public static void main(String[] args){
        People xiaocheng = new People("小成");
        System.out.println("第一種裝扮:");
        TShirts tShirts = new TShirts();
        BigTrouser bigTrouser = new BigTrouser();

        tShirts.Decorate(xiaocheng);
        bigTrouser.Decorate(tShirts);
        bigTrouser.operation();

    }
}
           
第一種裝扮:
垮褲TShirts裝飾的是小成
           
上一篇: 解釋器模式
下一篇: 通路者模式