Ch03_2

  • Uploaded by: xcygon
  • 0
  • 0
  • May 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Ch03_2 as PDF for free.

More details

  • Words: 1,467
  • Pages: 27
Design Patterns & Frameworks Chapter 3 – Introduction to Design Patterns

Conducted By Andy LAI

1

1. Topics     

Design Patterns Designing Generic Components Double-Buffered Generic Animation Applet Concrete Classes for Generic Components Question and Answer Session

2

2. Design Patterns 

Among the most importance recent developments of object-oriented technologies is the emergence of design patterns and frameworks, which are intended to address reuses of design and architectures.

3



The researchers compiled 23 of the most commonly used general purpose design patterns that are application domain independent and classified them as



1.



2.



3.

creational patterns, which deal with the process of object creation; structural patterns, which deal primarily with the static composition and structure of classes and objects; and behavioral patterns, which deal primarily with dynamic interaction among classes and objects. 4

3. Designing Generic Components 



Generic components are also known as reusable components. Two basic techniques of designing generic components are factorization and generalization..

5

3.1 Factorization 

One way to discover possible generic components is by identifying recurring code segments that are identical or nearly identical. An example of such recurring code segments are the nearly identical methods start(), stop(), and run() that appear in every animation applet. 6



Design Guideline – Maximize Flexibility



Flexibility allows components to be adapted to different contexts. The more flexible to a component is, the better is the chance that it may be reused.

7

3.2 Factorization by Inheritance - A Generic Animation Applet 

import java.awt.*;

   

public class AnimationApplet extends java.applet.Applet implements java.lang.Runnable {

    

  

public void start() { animationThread = new Thread(this); animationThread.start(); } public void stop() { animationThread = null; }

8

      

public void run() { while (Thread.currentThread() == animationThread) { try { Thread.currentThread().sleep(delay); } catch (InterruptedException e) {} repaint(); } } final public void setDelay(int delay) { this.delay = delay; }

   

final public int getDelay() { return delay; } protected Thread animationThread; protected int delay = 100;

     

}

9

4. Concrete Animation Applet  

import java.awt.*; import java.util.Calendar;

                

public class DigitalClock3 extends AnimationApplet { public DigitalClock3() { setDelay(1000); } public void paint(Graphics g) { Calendar calendar = Calendar.getInstance(); int hour = calendar.get(Calendar.HOUR_OF_DAY); int minute = calendar.get(Calendar.MINUTE); int second = calendar.get(Calendar.SECOND); g.setFont(font); g.setColor(color); g.drawString(hour + ":" + minute / 10 + minute % 10 + ":" + second / 10 + second % 10, 10, 60); } protected Font font = new Font("Monospaced", Font.BOLD, 48); protected Color color = Color.green;

10

5. A Double-Buffered Generic Animation Applet 

import java.awt.*;

  

public abstract class DBAnimationApplet extends AnimationApplet {

        

final public void update(Graphics g) { if (doubleBuffered) { paintFrame(offscreen); g.drawImage(im, 0, 0, this); } else { super.update(); } }

   

final public void paint(Graphics g) { paintFrame(g); }

 

11

     

final public void init() { d = getSize(); im = createImage(d.width, d.height); offscreen = im.getGraphics(); initAnimator(); }

 

protected void initAnimator() {}

 

abstract protected void paintFrame(Graphics g);

   

protected DBAnimationApplet(boolean doubleBuffered) { this.doubleBuffered = doubleBuffered; }

 

12

  

protected DBAnimationApplet() { this.doubleBuffered = true; }



protected boolean doubleBuffered; protected Dimension d; protected Image im; protected Graphics offscreen;

    

}

13

5.1 

Accommodate various sizes of the view area

1. In order to initializes the off-screen image buffer, we need to know the dimensions of the viewing area.

 

Add init() method:

     

public void init() { d = getSize(); im = createImage(d.width, d.height); offscreen = im.getGraphics(); }

14



2. subclass of DBAnimationApplet to get parameters

 

Overriding init() method:

 

public void init() {

   



String param = getParameter(..) super.init(); } 3. Minimizes the chance of Misuse

 

Design Guideline – Minimize the chance of Misuse

 

Well-designed classes should minimize their possible misuse by clearly identifying any violation of the convention of the classes, preferably at compile time.

15

     

final public void init() { d = getSize(); im = createImage(d.width, d.height); offscreen = im.getGraphics(); initAnimator(); }

 

protected void initAnimator() {}

 

The init() method is made final, so that it cannot be accidentally overridden by the subclasses. This approach ensures that initializations of dim, im and offscreen will always be done properly.

 



A null implementation is provided for initAnimator(). A subclass needs to override this protected method only when there are subclass specific initializations. protected void initAnimator() {  

String param = getParameter(..); }

16

5.2 Allow the subclasses to decide whether to use double-buffering.        

final public void update(Graphics g) { if (doubleBuffered) { paintFrame(offscreen); g.drawImage(im, 0, 0, this); } else { super.update(); } }

 

1. When double-buffering is not needed, the default implementation of update() should be used and the paint() method should be overridden by the subclass to paint a frame.



2. When double-buffering is need, the update() method should be overridden to paint to frame.

17

5.3 Factorize common code segments that contains variable parts 

The third key issue involves the user of double-buffering. The part of the update() method that deals with double-buffering is common to all animation applets, whereas the part that deals with painting the frames varies from applet to applet.

         

final public void update(Graphics g) { if (doubleBuffered) { paintFrame(offscreen); g.drawImage(im, 0, 0, this); } else { super.update(); } }

18

  

final public void paint(Graphics g) { paintFrame(g); }

      

final public void init() { d = getSize(); im = createImage(d.width, d.height); offscreen = im.getGraphics(); initAnimator(); }

 

protected void initAnimator() {}

 

abstract protected void paintFrame(Graphics g);

19



The initAnimator() and paintFrame() methods are protected, as they are intended only for the subclasses to override. Abstract method is declared to serve as a placeholder for the context specific code. The update() and paint(), and init() methods are final so that the subclasses cannot alter their implementation.

 

The conventions for using the double-buffered generic animation applet class are as follows.

 

• A concrete animation applet should extend the DBAnimationApplet class. The Boolean parameter of the constructor indicator whether double-buffering is needed.

 

• Each concrete animation applet must override the paintFrame() method to paint frames of the animation.

 

The initAnimator() method may be overridden to provide subclass specific initializations.

20

6 Concrete Double-Buffered Animation Applet: BouncingBall 2                     

<TITLE> The New BouncingBall Applet

The New BouncingBall Applet

<APPLET CODE=BouncingBall2.class WIDTH=250 HEIGHT=150>


The Source Code

  • Get the BouncingBall Applet!
  • Get the DBAnimationApplet!



    21



    import java.awt.*;

     

    public class BouncingBall2 extends DBAnimationApplet {

       

    public BouncingBall2() { super(true); // double buffering }

           

    protected void initAnimator() { String att = getParameter("delay"); if (att != null) setDelay(Integer.parseInt(att)); x = d.width * 2 / 3 ; y = d.height - radius; }

            

    protected void paintFrame(Graphics g) { g.setColor(Color.white); g.fillRect(0,0,d.width,d.height); if (x < radius || x > d.width - radius) { dx = -dx; }

    22

          

    if (y < radius || y > d.height - radius) { dy = -dy; } x += dx; y += dy; g.setColor(color); g.fillOval(x - radius, y - radius, radius * 2, radius * 2); }



    protected int x, y; protected int dx = -2, dy = -4; protected int radius = 20; protected Color color = Color.green;

        

    }

    23

    Page for diagrams AnimationApplet

    Applet

    start() stop() run() setDelay() getDelay()

    DigitalClock3 patint()

    4. Concrete Animation Applet

    24

    Page for diagrams AnimationApplet

    Applet

    start() stop() run() setDelay() getDelay()

    DBAnimationApplet update() paint() init() initAnimator() paintFrame()

    DigitalClock3

    BouncingBall2

    patint()

    initAnimator() paintFrame()

    6. Concrete Double-Buffered Animation Applet: Bouncing Ball

    25

    Page for diagrams

    6. Concrete Double-Buffered Animation Applet: Bouncing Ball 26

    Que sti on & Ans wer Ses si on

    27

  • More Documents from "xcygon"

    Lecture1014
    May 2020 6
    Dle Ch
    May 2020 12
    Ch03_2
    May 2020 3
    Hrm445 Chapter_013
    May 2020 2
    May 2020 3