Slide 1

Slide 1 text

CSE360 Introduction to Software Engineering Lecture 20: Software Design Patterns: Decorator Javier Gonzalez-Sanchez [email protected] javiergs.engineering.asu.edu Office Hours: By appointment

Slide 2

Slide 2 text

Case 1: Everything you need to know for project 4 about Decorator pattern.

Slide 3

Slide 3 text

Javier Gonzalez-Sanchez | CSE360 | Summer 2017 | 3 Decorator

Slide 4

Slide 4 text

Javier Gonzalez-Sanchez | CSE360 | Summer 2017 | 4 Main

Slide 5

Slide 5 text

Javier Gonzalez-Sanchez | CSE360 | Summer 2017 | 5 Companion public interface Companion { public void doSomething(); }

Slide 6

Slide 6 text

Javier Gonzalez-Sanchez | CSE360 | Summer 2017 | 6 BasicCompanion public class BasicCompanion implements Companion { @Override public void doSomething() { System.out.print("Hello Student, "); } }

Slide 7

Slide 7 text

Javier Gonzalez-Sanchez | CSE360 | Summer 2017 | 7 CompanionDecorator public class CompanionDecorator implements Companion { protected Companion c; public void add(Companion c){ this.c = c; } @Override public void doSomething() { this.c.doSomething(); } }

Slide 8

Slide 8 text

Javier Gonzalez-Sanchez | CSE360 | Summer 2017 | 8 HelperCompanion public class HelperCompanion extends CompanionDecorator { @Override public void doSomething(){ super.doSomething(); System.out.print(" I am here to help you. "); } }

Slide 9

Slide 9 text

Javier Gonzalez-Sanchez | CSE360 | Summer 2017 | 9 AffectiveCompanion public class AffectiveCompanion extends CompanionDecorator { @Override public void doSomething(){ super.doSomething(); System.out.print(" I am here to cheer you."); } }

Slide 10

Slide 10 text

Javier Gonzalez-Sanchez | CSE360 | Summer 2017 | 10 Main

Slide 11

Slide 11 text

Case 2: Everything you need to know for project 4 about Decorator pattern.

Slide 12

Slide 12 text

Javier Gonzalez-Sanchez | CSE360 | Summer 2017 | 12 Decorator

Slide 13

Slide 13 text

Javier Gonzalez-Sanchez | CSE360 | Summer 2017 | 13 Main import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class Main extends JFrame implements ActionListener { CompanionPanel panel = new CompanionPanel (); JButton b1 = new JButton("standard"); JButton b2 = new JButton("help"); JButton b3 = new JButton("affect"); JButton b4 = new JButton("helper+affect"); public Main() { setLayout(new BorderLayout(3,2)); add (panel, BorderLayout.CENTER); JPanel control = new JPanel(new GridLayout(1,4)); control.add (b1); b1.addActionListener(this); control.add (b2); b2.addActionListener(this); control.add (b3); b3.addActionListener(this); control.add (b4); b4.addActionListener(this); add (control, BorderLayout.SOUTH); }

Slide 14

Slide 14 text

@Override public void actionPerformed(ActionEvent e) { if (e.getSource()==b1) { BasicCompanion basic = new BasicCompanion(); panel.setCompanion(basic); panel.showYourself(); } else if (e.getSource()==b2) { BasicCompanion basic = new BasicCompanion(); HelperCompanion helper = new HelperCompanion(); helper.add(basic); panel.setCompanion(helper); panel.showYourself(); } else if (e.getSource()==b3) { BasicCompanion basic = new BasicCompanion(); AffectiveCompanion h = new AffectiveCompanion(); h.add(basic); panel.setCompanion(h); panel.showYourself(); } else if (e.getSource()==b4) { HelperCompanion helper2 = new HelperCompanion(); AffectiveCompanion affective = new AffectiveCompanion(); BasicCompanion basic2 = new BasicCompanion(); helper2.add(affective); affective.add(basic2); panel.setCompanion(helper2);panel.showYourself(); } } public static void main(String[] args) { JFrame main = new Main(); main.setSize(500,500); main.setVisible(true); main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }

Slide 15

Slide 15 text

Javier Gonzalez-Sanchez | CSE360 | Summer 2017 | 15 CompanionPanel import java.awt.GridLayout; import javax.swing.JLayeredPane; public class CompanionPanel extends JLayeredPane{ public Companion brain; public void setCompanion(Companion x) { brain = x; } public void showYourself() { removeAll(); setLayout(new GridLayout(1,1)); brain.doSomething(this); revalidate(); } }

Slide 16

Slide 16 text

Javier Gonzalez-Sanchez | CSE360 | Summer 2017 | 16 Companion import javax.swing.JComponent; public interface Companion { public void doSomething(JComponent panel); }

Slide 17

Slide 17 text

Javier Gonzalez-Sanchez | CSE360 | Summer 2017 | 17 BasicCompanion import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JLabel; public class BasicCompanion implements Companion { @Override public void doSomething(JComponent panel) { ImageIcon face = new ImageIcon("src/face.png"); JLabel label = new JLabel(); label.setIcon(face); label.setHorizontalTextPosition(JLabel.CENTER); label.setVerticalTextPosition(JLabel.BOTTOM); label.setText("Hello Student, "); panel.add(label); } }

Slide 18

Slide 18 text

Javier Gonzalez-Sanchez | CSE360 | Summer 2017 | 18 CompanionDecorator import javax.swing.JComponent; public class CompanionDecorator implements Companion { protected Companion c; public void add(Companion c){ this.c=c; } @Override public void doSomething(JComponent panel) { this.c.doSomething(panel); } }

Slide 19

Slide 19 text

Javier Gonzalez-Sanchez | CSE360 | Summer 2017 | 19 AffectiveCompanion import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JLabel; public class AffectiveCompanion extends CompanionDecorator { @Override public void doSomething(JComponent panel){ super.doSomething(panel); ImageIcon face = new ImageIcon("src/cheer.png"); JLabel label = new JLabel(); label.setIcon(face); label.setHorizontalTextPosition(JLabel.CENTER); label.setVerticalTextPosition(JLabel.BOTTOM); label.setText("I am here to cheer you."); panel.add(label); } }

Slide 20

Slide 20 text

Javier Gonzalez-Sanchez | CSE360 | Summer 2017 | 20 HelperCompanion import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JLabel; public class HelperCompanion extends CompanionDecorator { @Override public void doSomething(JComponent panel){ super.doSomething(panel); ImageIcon face = new ImageIcon("src/bubble.png"); JLabel label = new JLabel(); label.setIcon(face); label.setHorizontalTextPosition(JLabel.CENTER); label.setVerticalTextPosition(JLabel.BOTTOM); label.setText("I am here to help you."); panel.add(label); } }

Slide 21

Slide 21 text

Javier Gonzalez-Sanchez | CSE360 | Summer 2017 | 21 GUI

Slide 22

Slide 22 text

Test Yourselves

Slide 23

Slide 23 text

Javier Gonzalez-Sanchez | CSE360 | Summer 2017 | 23 Class Diagram

Slide 24

Slide 24 text

CSE360 – Introduction to Software Engineering Javier G onzalez-Sanchez javiergs@ asu.edu Sum m er 2017 Disclaim er. These slides can only be used as study m aterial for the class C SE360 at ASU. They cannot be distributed or used for another purpose.