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() } }