無廢話設計模式(7)結構型模式--裝飾模式

大叔楊發表於2020-07-31

0-前言

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

1-實現

1-1、易看的UML圖:

 

 

 

1-2、程式碼實現:

//1、演員類(component,直接實現,未抽取父類,可抽取父類)
class  Actor
{
    public void  Act()
    {
        System.out.println("演員開始表演了");
    }
}

//2、Decorator(裝飾抽象類)
class  Stylist extends Actor
{
    protected  Actor actor;

    public void  MakeActor(Actor _actor)
    {
        this.actor = _actor;
    }

    @Override
    public void Act()
    {
        if (actor !=null)
        {
            actor.Act();
        }
    }
}

//2-1、ConcreteComponentA(具體裝飾者A--古裝造型師)
class AncientStylist extends Stylist
{
    private String State;

    @Override
    public void Act()
    {
        System.out.println("古裝造型師給演員化妝了");
        State  = "演員狀態挺好的";
        System.out.println(State);
        super.Act();
    }
}

//2-2、ConcreteComponentB(具體裝飾者B)
class ModernStylist extends Stylist
{
    public void AddBehaver()
    {
        System.out.println("給演員打了個氣");
    }

    @Override
    public void Act()
    {
        System.out.println("現代造型師給演員化妝了");
        AddBehaver();
        super.Act();
    }

客戶端:

        Actor actor = new Actor();
        AncientStylist ancientStylist =new AncientStylist();
        ModernStylist modernStylist = new ModernStylist();

        ancientStylist.MakeActor(actor);
        ancientStylist.Act();

        modernStylist.MakeActor(actor);
        modernStylist.Act();

 

執行結果:

 

 

2、應用場景簡單總結

1、當需要以不影響其他物件為前提實現動態、透明地給單個物件新增職責時;

2、當需要將物件的某些職責進行撤銷操作時;

3、當不能用生成子類的方法進行當前系統的擴充時;

 

相關文章