日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線(xiàn)咨詢(xún)客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

裝飾器模式(Decorator Pattern)是一種結(jié)構(gòu)型設(shè)計(jì)模式,它可以在不改變現(xiàn)有對(duì)象的結(jié)構(gòu)的情況下,動(dòng)態(tài)地給對(duì)象增加一些額外的功能。裝飾器模式通過(guò)創(chuàng)建一個(gè)包裝對(duì)象(即裝飾器)來(lái)包裹真實(shí)對(duì)象,并在保持真實(shí)對(duì)象的接口不變的前提下,為其提供額外的功能。裝飾器模式可以在運(yùn)行時(shí)根據(jù)需要選擇不同的裝飾器來(lái)組合和修改對(duì)象的行為。
圖片

  • Component(組件接口):所有被裝飾組件及裝飾器對(duì)應(yīng)的接口標(biāo)準(zhǔn),指定進(jìn)行裝飾的行為方法。對(duì)應(yīng)下文的的組件接口 Shape 。
  • ConcreteComponent(組件實(shí)現(xiàn)):需要被裝飾的組件,實(shí)現(xiàn)組件接口標(biāo)準(zhǔn),只具備自身未被裝飾的原始特性。對(duì)應(yīng)下文的的具體組件 Circle 、Rectangle 。
  • Decorator(裝飾器):裝飾器的高層抽象類(lèi),同樣實(shí)現(xiàn)組件接口標(biāo)準(zhǔn),且包含一個(gè)被裝飾的組件。對(duì)應(yīng)下文的抽象裝飾器 ShapeDecorator 。
  • ConcreteDecorator(裝飾器實(shí)現(xiàn)):繼承自裝飾器抽象類(lèi)的具體子類(lèi)裝飾器,可以有多種實(shí)現(xiàn),在被裝飾組件對(duì)象的基礎(chǔ)上為其添加新的特性。對(duì)應(yīng)下文的具體裝飾器類(lèi) RedShapeDecorator 、GreenShapeDecorator 。

優(yōu)缺點(diǎn)

裝飾器模式的優(yōu)點(diǎn)有:

  • 裝飾器模式是繼承的有力補(bǔ)充,比繼承靈活,在不改變?cè)袑?duì)象的情況下,動(dòng)態(tài)地給一個(gè)對(duì)象擴(kuò)展功能,即插即用。
  • 通過(guò)使用不同的裝飾器及這些裝飾器的排列組合,可以實(shí)現(xiàn)不同效果。
  • 裝飾器模式完全遵守開(kāi)閉原則,可以在不修改原有代碼的基礎(chǔ)上增加新的功能。

裝飾器模式的缺點(diǎn)有:

  • 裝飾器模式會(huì)增加許多子類(lèi),過(guò)度使用會(huì)增加程序的復(fù)雜性。
  • 裝飾器模式會(huì)增加對(duì)象之間的聯(lián)系,可能會(huì)引入循環(huán)引用的問(wèn)題。
  • 裝飾器模式會(huì)影響對(duì)象的標(biāo)識(shí),當(dāng)使用裝飾器對(duì)對(duì)象進(jìn)行包裝時(shí),對(duì)象的類(lèi)型和行為可能會(huì)發(fā)生變化。

應(yīng)用場(chǎng)景

裝飾器模式適用于以下場(chǎng)景:

  • 當(dāng)需要給一個(gè)現(xiàn)有的類(lèi)添加附加職責(zé),而又不能采用繼承的方式時(shí),可以使用裝飾器模式。例如,在不修改原有代碼的情況下給一個(gè)窗口添加滾動(dòng)條或者邊框等功能。
  • 當(dāng)需要?jiǎng)討B(tài)地給一個(gè)對(duì)象增加功能,而又需要撤銷(xiāo)該功能時(shí),可以使用裝飾器模式。例如,在電子商務(wù)系統(tǒng)中根據(jù)用戶(hù)選擇的不同優(yōu)惠券來(lái)計(jì)算商品價(jià)格時(shí),可以使用裝飾器模式來(lái)實(shí)現(xiàn)。
  • 當(dāng)需要為一批兄弟類(lèi)進(jìn)行改裝或加裝功能時(shí),可以使用裝飾器模式。例如,在一個(gè)圖形界面工具箱中為多個(gè)不同的組件提供一些公共的功能時(shí),可以使用裝飾器模式來(lái)實(shí)現(xiàn)。

JAVA 代碼示例

以下是一個(gè)實(shí)現(xiàn)裝飾器模式的 java 示例代碼

  1. 定義了一個(gè)抽象組件接口 Shape 和兩個(gè)具體組件類(lèi) Circle 和 Rectangle,
//抽象組件接口
public interface Shape {
    void draw();
}

//具體組件類(lèi):圓形
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a circle");
    }
}

//具體組件類(lèi):矩形
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a rectangle");
    }
}
  1. 定義一個(gè)抽象裝飾器類(lèi) ShapeDecorator 和兩個(gè)具體裝飾器類(lèi) RedShapeDecorator 和 GreenShapeDecorator,
//抽象裝飾器類(lèi)
public abstract class ShapeDecorator implements Shape {
    //持有一個(gè)抽象組件對(duì)象
    protected Shape shape;

    //構(gòu)造方法
    public ShapeDecorator(Shape shape) {
        this.shape = shape;
    }

    //調(diào)用被包裝對(duì)象的方法
    @Override
    public void draw() {
        shape.draw();
    }
}

//具體裝飾器類(lèi):紅色裝飾器
public class RedShapeDecorator extends ShapeDecorator {
    //構(gòu)造方法
    public RedShapeDecorator(Shape shape) {
        super(shape);
    }

    //重寫(xiě)draw方法,在調(diào)用被包裝對(duì)象的方法之前或之后添加新的功能
    @Override
    public void draw() {
        //調(diào)用被包裝對(duì)象的方法
        super.draw();
        //添加新的功能
        setRedBorder();
    }

    //定義新的功能方法
    private void setRedBorder() {
        System.out.println("Setting red border");
    }
}

//具體裝飾器類(lèi):綠色裝飾器
public class GreenShapeDecorator extends ShapeDecorator {
    //構(gòu)造方法
    public GreenShapeDecorator(Shape shape) {
        super(shape);
    }

    //重寫(xiě)draw方法,在調(diào)用被包裝對(duì)象的方法之前或之后添加新的功能
    @Override
    public void draw() {
        //調(diào)用被包裝對(duì)象的方法
        super.draw();
        //添加新的功能
        setGreenBorder();
    }

    //定義新的功能方法
    private void setGreenBorder() {
        System.out.println("Setting green border");
    }
}

  1. 編寫(xiě)裝飾器模式測(cè)試代碼,mAIn 函數(shù)中創(chuàng)建了不同的組件和裝飾器對(duì)象,并調(diào)用了它們的方法,
//測(cè)試類(lèi)
public class DecoratorPatternDemo {
    public static void main(String[] args) {
        //創(chuàng)建一個(gè)圓形對(duì)象
        Shape circle = new Circle();
        //創(chuàng)建一個(gè)矩形對(duì)象
        Shape rectangle = new Rectangle();
        //創(chuàng)建一個(gè)紅色裝飾器對(duì)象,包裝圓形對(duì)象
        Shape redCircle = new RedShapeDecorator(circle);
        //創(chuàng)建一個(gè)綠色裝飾器對(duì)象,包裝矩形對(duì)象
        Shape greenRectangle = new GreenShapeDecorator(rectangle);

        //調(diào)用各個(gè)對(duì)象的方法,展示不同的效果
        System.out.println("Normal circle:");
        circle.draw();
        System.out.println("Normal rectangle:");
        rectangle.draw();
        System.out.println("Red circle:");
        redCircle.draw();
        System.out.println("Green rectangle:");
        greenRectangle.draw();
    }
}

輸出結(jié)果如下:

Normal circle:
Drawing a circle
Normal rectangle:
Drawing a rectangle
Red circle:
Drawing a circle
Setting red border
Green rectangle:
Drawing a rectangle
Setting green border

Spring 代碼示例

要想再 Spring 項(xiàng)目中應(yīng)用裝飾器模式,只需對(duì)以上代碼進(jìn)行簡(jiǎn)單改造即可,

  1. 給具體組件類(lèi) Circle、Rectangle 添加 @Component 注解,
@Component
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a rectangle");
    }
}

@Component
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a rectangle");
    }
}
  1. 給具體裝飾器類(lèi) RedShapeDecorator 和 GreenShapeDecorator 類(lèi)添加 @Component 注解,
@Component
public class GreenShapeDecorator extends ShapeDecorator {
    // 構(gòu)造方法
    public GreenShapeDecorator(@Qualifier("rectangle") Shape shape) {
        super(shape);
    }

    // 重寫(xiě)draw方法,在調(diào)用被包裝對(duì)象的方法之前或之后添加新的功能
    @Override
    public void draw() {
        // 調(diào)用被包裝對(duì)象的方法
        super.draw();
        // 添加新的功能
        setGreenBorder();
    }

    // 定義新的功能方法
    private void setGreenBorder() {
        System.out.println("Setting green border");
    }
}

@Component
public class RedShapeDecorator extends ShapeDecorator {
    // 構(gòu)造方法
    public RedShapeDecorator(@Qualifier("circle") Shape shape) {
        super(shape);
    }

    // 重寫(xiě)draw方法,在調(diào)用被包裝對(duì)象的方法之前或之后添加新的功能
    @Override
    public void draw() {
        // 調(diào)用被包裝對(duì)象的方法
        super.draw();
        // 添加新的功能
        setRedBorder();
    }

    // 定義新的功能方法
    private void setRedBorder() {
        System.out.println("Setting red border");
    }
}
  1. 編寫(xiě) Spring 項(xiàng)目測(cè)試代碼,
@SpringBootTest
@RunWith(SpringRunner.class)
public class DecoratorTest {

    // 從Spring容器中獲取Context對(duì)象
    @Autowired
    private RedShapeDecorator redCircle;
    @Autowired
    private GreenShapeDecorator greenRectangle;

    @Test
    public void test() {
        System.out.println("Red circle:");
        redCircle.draw();
        System.out.println("Green rectangle:");
        greenRectangle.draw();
    }
}

輸出結(jié)果如下:

Red circle:
Drawing a circle
Setting red border
Green rectangle:
Drawing a rectangle
Setting green border

總結(jié)

裝飾器模式可以將不同功能的單個(gè)模塊規(guī)劃至不同的裝飾器類(lèi)中,各裝飾器類(lèi)獨(dú)立自主,各司其職。客戶(hù)端可以根據(jù)自己的需求自由搭配各種裝飾器,每加一層裝飾就會(huì)有新的特性體現(xiàn)出來(lái),巧妙的設(shè)計(jì)讓功能模塊層層疊加,裝飾之上套裝飾,最終使原始對(duì)象的特性動(dòng)態(tài)地得到增強(qiáng)。

分享到:
標(biāo)簽:模式 設(shè)計(jì)
用戶(hù)無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定