Design Patterns - (14) Decorator Pattern (Swift Version)

1. Concept

  Decorator Pattern (Decorator): Dynamically add some additional responsibilities to an object. To extend the functionality of an object, decorators provide a more flexible alternative to inheritance.

  More composition, less inheritance

 

Second, UML diagram

  

  

  Abstract component class (Component): Gives an abstract interface to standardize objects that are ready to receive additional responsibilities

  Concrete component class (ConcreteComponent): Define a specific class that is ready to accept additional responsibilities, which must implement the Component interface.

  Decorator: Holds an instance of a Component object and defines an interface consistent with the abstract component.

  Concrete Decoratator: Defines additional responsibilities for "sticking" to component objects.

 

Three, use cases

  

protocol Component {
    func display() -> Void;
}

class ComponentDecorator: Component {
    
    var component: Component
    var border: String?
    
    init(component: Component) {
        self.component = component
    }
    
    func display() {
        component.display()
    }
}

 

class ListView: Component {
    
    var name: String = "listView"
    
    func display() {
        print(name)
    }
}

class BoxView: Component {
    
    var name: String = "boxView"
    
    func display() {
        print(name)
    }
}

 

class BlackBoder: ComponentDecorator {
    
    override init(component: Component) {
        super.init(component: component)
        border = "black"
    }
    
    override func display() {
        setBorder()
        super.display()
    }
    
    func setBorder () {
        print("this border is \(border ?? "default")")
    }
    
}

class YellowBoder: ComponentDecorator {
    
    override init(component: Component) {
        super.init(component: component)
        border = "yellow"
    }
    
    override func display() {
        setBorder()
        super.display()
    }
    
    func setBorder () {
        print("this border is \(border ?? "default")")
    }
    
}

 user terminal:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let component = ListView()
        let componentB = YellowBoder(component: component)
        componentB.display()
    }
}

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324646911&siteId=291194637