設(shè)計(jì)模式之裝飾器模式

1 裝飾器模式

裝飾器模式允許向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu),它是作為現(xiàn)有類的一個(gè)包裝。


2 類圖實(shí)現(xiàn)

 

這里最關(guān)鍵的是我們裝飾器類(抽象類)既實(shí)現(xiàn)了原始功能接口(Shape接口)又和原始接口是關(guān)聯(lián)關(guān)系(Shape接口作為這個(gè)抽象裝飾類的成員變量)


3 代碼實(shí)現(xiàn)

    public interface Shape {
       void draw();
    }

    public class Rectangle implements Shape {
     
       @Override
       public void draw() {
          System.out.println("Shape: Rectangle");
       }
    }

    public class Circle implements Shape {
     
       @Override
       public void draw() {
          System.out.println("Shape: Circle");
       }
    }

    public abstract class ShapeDecorator implements Shape {
       protected Shape decoratedShape;
     
       public ShapeDecorator(Shape decoratedShape){
          this.decoratedShape = decoratedShape;
       }
     
       public void draw(){
          decoratedShape.draw();
       }  
    }

    public class RedShapeDecorator extends ShapeDecorator {
     
       public RedShapeDecorator(Shape decoratedShape) {
          super(decoratedShape);     
       }
     
       @Override
       public void draw() {
          decoratedShape.draw();         
          setRedBorder(decoratedShape);
       }
     
       private void setRedBorder(Shape decoratedShape){
          System.out.println("Border Color: Red");
       }
    }

    public class DecoratorPatternDemo {
       public static void main(String[] args) {
     
          Shape circle = new Circle();
          ShapeDecorator redCircle = new RedShapeDecorator(new Circle());
          ShapeDecorator redRectangle = new RedShapeDecorator(new Rectangle());
          //Shape redCircle = new RedShapeDecorator(new Circle());
          //Shape redRectangle = new RedShapeDecorator(new Rectangle());
          System.out.println("Circle with normal border");
          circle.draw();
     
          System.out.println("\nCircle of red border");
          redCircle.draw();
     
          System.out.println("\nRectangle of red border");
          redRectangle.draw();
       }
    }

 
4 運(yùn)行結(jié)果

    Circle with normal border
    Shape: Circle
     
    Circle of red border
    Shape: Circle
    Border Color: Red
     
    Rectangle of red border
    Shape: Rectangle
    Border Color: Red

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

1)繼承的缺點(diǎn):如果我們用繼承的方式增加新功能,繼承為類引入靜態(tài)特征,并且隨著擴(kuò)展功能的增多,子類會(huì)很膨脹

2)裝飾器的有點(diǎn):裝飾類和被裝飾類可以獨(dú)立發(fā)展,不相互耦合,裝飾模式是繼承的一個(gè)替代模式,裝飾模式可以動(dòng)態(tài)擴(kuò)展一個(gè)實(shí)現(xiàn)類的功能

部分參考:https://www.runoob.com/design-pattern/decorator-pattern.html
 

 



 

 

作者:chen.yu
深信服三年半工作經(jīng)驗(yàn),目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號(hào):編程入門(mén)到禿頭 或掃描下面二維碼
零基礎(chǔ)入門(mén)進(jìn)階人工智能(鏈接)