$30 off During Our Annual Pro Sale. View Details »

CSE564 Lecture 13

CSE564 Lecture 13

Software Design
Decorator
(202110)

Javier Gonzalez-Sanchez
PRO

September 13, 2020
Tweet

More Decks by Javier Gonzalez-Sanchez

Other Decks in Programming

Transcript

  1. jgs
    CSE 564
    Software Design
    Lecture 13: Design Patterns - Decorator
    Dr. Javier Gonzalez-Sanchez
    [email protected]
    javiergs.engineering.asu.edu | javiergs.com
    PERALTA 230U
    Office Hours: By appointment

    View Slide

  2. jgs
    Previously

    View Slide

  3. jgs
    564 00001101
    GoF Patterns

    View Slide

  4. jgs
    564 00001101
    Singleton

    View Slide

  5. jgs
    564 00001101
    Singleton
    class Singleton{
    private static Singleton _instance;
    // Constructor is 'protected'
    protected Singleton() {}
    public static Singleton getInstance(){
    if (_instance == null){
    _instance = new Singleton();
    }
    return _instance;
    }
    }

    View Slide

  6. jgs
    564 00001101
    Singleton
    class MainApp {
    public static void Main(String []a){
    // Constructor is protected -- cannot use new
    Singleton s1 = Singleton.getInstance();
    Singleton s2 = Singleton.getInstance();
    // Test for same instance
    if (s1 == s2){
    // true - Objects are the same instance
    }
    }
    }

    View Slide

  7. jgs
    564 00001101
    Logger

    View Slide

  8. jgs
    564 00001101
    Desktop

    View Slide

  9. jgs
    Composite and Decorator

    View Slide

  10. jgs
    564 00001101
    GoF Patterns

    View Slide

  11. jgs
    564 00001101
    Decorator vs Inheritance
    § Both allow you to change how an object behaves
    § The decorator pattern can be used to make it possible to extend (decorate)
    the functionality of a certain object at runtime.
    § Inheritance adds behavior at compilation-time.

    View Slide

  12. jgs
    564 00001101
    Decorator

    View Slide

  13. jgs
    564 00001101
    Practical Examples
    How Java Widgets and Containers work?

    View Slide

  14. jgs
    564 00001101
    Component
    abstract class Component {
    public abstract void operation();
    }

    View Slide

  15. jgs
    564 00001101
    ConcreteComponent
    class ConcreteComponent extends Component {
    @override
    public void operation() {
    System.out.print("ConcreteComponent-Operation()");
    }
    }

    View Slide

  16. jgs
    564 00001101
    Decorator
    abstract class Decorator extends Component {
    protected Component component;
    public void setComponent(Component component) {
    this.component = component;
    }
    @override
    public void operation() {
    if (component != null) {
    component.operation();
    }
    }
    }

    View Slide

  17. jgs
    564 00001101
    ConcreteDecoratorA
    class ConcreteDecoratorA extends Decorator {
    @override
    public void operation() {
    super.operation();
    System.out.println("ConcreteDecoratorA-Operation()”);
    }
    }

    View Slide

  18. jgs
    564 00001101
    ConcreteDecoratorB
    class ConcreteDecoratorB extends Decorator {
    @override
    public void operation() {
    super.operation();
    addedBehavior();
    System.out.println("ConcreteDecoratorB-Operation()");
    }
    void addedBehavior() {
    }
    }

    View Slide

  19. jgs
    564 00001101
    Main
    class MainApp {
    static void main() {
    // Create ConcreteComponent and two Decorators
    ConcreteComponent c = new ConcreteComponent();
    ConcreteDecoratorA d1 = new ConcreteDecoratorA();
    ConcreteDecoratorB d2 = new ConcreteDecoratorB();
    // Link decorators
    d1.SetComponent(c);
    d2.SetComponent(d1);
    d2.Operation();
    }
    }

    View Slide

  20. jgs
    564 00001101
    Main
    class MainApp {
    static void main() {
    // Create ConcreteComponent and two Decorators
    ConcreteComponent c = new ConcreteComponent();
    ConcreteDecoratorA d1 = new ConcreteDecoratorA();
    ConcreteDecoratorB d2 = new ConcreteDecoratorB();
    // Link decorators
    d1.SetComponent(c);
    d2.SetComponent(d1);
    d2.Operation();
    }
    }
    ConcreteComponent - Operation()
    ConcreteDecoratorA - Operation()
    ConcreteDecoratorB - Operation()

    View Slide

  21. jgs
    Inheritance vs Decoration/Composition

    View Slide

  22. jgs
    564 00001101
    Scenario
    CompanionHelper
    CompanionTroll
    Companion

    View Slide

  23. jgs
    564 00001101
    Scenario
    CompanionHelper
    CompanionTroll
    Companion
    CompanionTrollHelper

    View Slide

  24. jgs
    564 00001101
    Scenario
    CompanionHelper
    CompanionTroll
    Companion
    CompanionTrollHelper

    View Slide

  25. jgs
    564 00001101
    Decorator
    WhiteBody body = new WhiteBody();
    Mask mask = new Mask();
    Helmet helmet = new Helmet();
    // Link decorators
    mask.SetComponent(body);
    helmet.SetComponent(mask);
    helmet.Operation();

    View Slide

  26. jgs
    CSE 564 Software Design
    Javier Gonzalez-Sanchez, Ph.D.
    [email protected]
    Fall 2021
    Copyright. These slides can only be used as study material for the class CSE564 at ASU.
    They cannot be distributed or used for another purpose.

    View Slide