Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

jgs Previously

Slide 3

Slide 3 text

jgs 564 00001101 GoF Patterns

Slide 4

Slide 4 text

jgs 564 00001101 Singleton

Slide 5

Slide 5 text

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; } }

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

jgs 564 00001101 Logger

Slide 8

Slide 8 text

jgs 564 00001101 Desktop

Slide 9

Slide 9 text

jgs Composite and Decorator

Slide 10

Slide 10 text

jgs 564 00001101 GoF Patterns

Slide 11

Slide 11 text

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.

Slide 12

Slide 12 text

jgs 564 00001101 Decorator

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

jgs Inheritance vs Decoration/Composition

Slide 22

Slide 22 text

jgs 564 00001101 Scenario CompanionHelper CompanionTroll Companion

Slide 23

Slide 23 text

jgs 564 00001101 Scenario CompanionHelper CompanionTroll Companion CompanionTrollHelper

Slide 24

Slide 24 text

jgs 564 00001101 Scenario CompanionHelper CompanionTroll Companion CompanionTrollHelper

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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.