CS 350 – Software Design Putting Patterns Together Let’s put a lot of patterns together. We need a lot of ducks! public interface Quackable { public void.

Slides:



Advertisements
Similar presentations
Continuation of chapter 6…. Nested while loop A while loop used within another while loop is called nested while loop. Q. An illustration to generate.
Advertisements

CS 350 – Software Design The Bridge Pattern – Chapter 10 Most powerful pattern so far. Gang of Four Definition: Decouple an abstraction from its implementation.
Marcelo Santos – OOAD-CDT309, Spring 2008, IDE-MdH 1 Object-Oriented Analysis and Design - CDT309 Period 4, Spring 2008 Open-closed principle.
Chapter 4: The Factory Pattern. Consider the Following Code Fragment Duck duck; if (picnic) { duck = new MallardDuck(); } else if (hunting) { duck = new.
Strategy Pattern1 Design Patterns 1.Strategy Pattern How to design for flexibility?
CS 116 OBJECT ORIENTED PROGRAMMING II LECTURE 9 GEORGE KOUTSOGIANNAKIS Copyright: 2015 Illinois Institute of Technology/George Koutsogiannakis 1.
March Ron McFadyen1 Composite Used to compose objects into tree structures to represent part-whole hierarchies Composite lets clients treat.
Design Patterns. What is a Design Pattern? Generic pattern for solving a certain class of problem Learn to recognize the class of problem and apply a.
The Observer Pattern. Formal Definition Define a one-to-many dependency between objects so that when one object changes state, all its dependents are.
Design Patterns. What are design patterns? A general reusable solution to a commonly occurring problem. A description or template for how to solve a problem.
Design Patterns.
Chapter 1: Introduction to Design Patterns. SimUDuck Example.
CS 350 – Software Design Template Method Pattern Let’s look at two objects public class Coffee { public void prepareRecipe() { public void prepareRecipe()
1 Unit 5 Design Patterns: Design by Abstraction. 2 What Are Design Patterns?  Design patterns are: Schematic descriptions of design solutions to recurring.
Design Pattern. The Observer Pattern The Observer Pattern defines a one-to-many dependency between objects so that when one object changes state, all.
CS 210 Introduction to Design Patterns September 7 th, 2006.
Observer Behavioral Pattern. Intent Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified.
CS 350 – Software Design The Observer Pattern – Chapter 18 Let’s expand the case study to include new features: Sending a welcome letter to new customers.
CS 210 Adapter Pattern October 19 th, Adapters in real life Page 236 – Head First Design Patterns.
Week 2, Day 2: The Factory Method Pattern Other good design principles Cohesion vs. Coupling Implementing the Strategy Pattern Changing strategies (behaviors)
Design Patterns CSIS 3701: Advanced Object Oriented Programming.
Chapter 21 Test-Driven Development 1CS6359 Fall 2011 John Cole.
Creational Patterns
July 28, 2015IAT 2651 Design Patterns. “Gang of Four” July 28, 2015IAT 2652.
Chapter 7: The Adapter Pattern. Object Oriented Adapters Suppose that you have existing software. You have outsourced some of your work and there is a.
Object-Oriented Design and Programming (Java). 2 Topics Covered Today 2.3 Advanced Class Design –2.3.4 Design Patterns –2.3.5 Singleton Pattern –2.3.6.
CS 415 N-Tier Application Development By Umair Ashraf June 22,2013 National University of Computer and Emerging Sciences Lecture # 3 Design Patterns (Observer,Factory,Singleton)
CS 210 Final Review November 28, CS 210 Adapter Pattern.
Design Patterns Introduction
CS 210 Introduction to Design Patterns August 29, 2006.
Computer Science 209 Software Development Inheritance and Composition.
CS 210 Iterator Pattern October 31 st, Example to motivate discussion We have two lists (of menu items) one implemented using ArrayList and another.
CS 210 Review October 3, 2006.
Bridge Bridge is used when we need to decouple an abstraction from its implementation so that the two can vary independently. This type of design pattern.
Example to motivate discussion We have two lists (of menu items) one implemented using ArrayList and another using Arrays. How does one work with these.
Proxy Pattern defined The Proxy Pattern provides a surrogate or placeholder for another object to control access to it by creating a representative object.
Watching the movie the hard way…. Page 256 – Head First Design Patterns.
It started with a simple … A highly successful duck pond simulation game called SimUDuck The game can show a large variety of duck swimming and making.
CS 210 Proxy Pattern Nov 16 th, RMI – A quick review A simple, easy to understand tutorial is located here:
Abstract Classes and Interfaces. Let’s say we are working on a video game together… Our job is to independently write two different enemies for the game.
Systems Requirements SE 3821 Design? Algorithms CS 2852.
Façade Design Pattern by Ali Alkhafaji Unified interface for a set of interfaces to promote readability and usability.
An object's behavior depends on its current state. Operations have large, multipart conditional statements that depend on the object's state.
This In Java, the keyword this allows an object to refer to itself. Or, in other words, this refers to the current object – the object whose method or.
CS 210 Adapter Pattern October 17 th, Adapters in real life Page 236 – Head First Design Patterns.
Adapter Pattern. public interface Duck { public void quack(); public void fly(); } public interface Turkey { public void gobble(); public void fly();
// create some behaviors SwimBehavior csb = new CircularSwimming(); QuackBehavior sqb = new StandardQuacking(); SwimBehavior rsb = new RandomFloating();
CS 350 – Software Design The Decorator Pattern – Chapter 17 In this chapter we expand our e-commerce case study and learn how to use the Decorator Pattern.
OBSERVER PATTERN OBSERVER PATTERN Presented By Presented By Ajeet Tripathi ISE
1 Iterator Pattern (A Behavioral Pattern) Prepared by: Neha Tomar.
SE 461 Software Patterns. FACTORY METHOD PATTERN.
Observer Pattern Context:
SE 461 Software Patterns Welcome to Design Patterns.
Intro to Design Pattern
Design Patterns: MORE Examples
Strategy Pattern.
Common Design Patterns
Design Patterns Lecture part 2.
Week 2, Day 1: The Factory Method Pattern
Chapter 8, Design Patterns Bridge
Strategy Design Pattern
More on Classes & Arrays
Design Patterns in Game Design
Interface.
class PrintOnetoTen { public static void main(String args[]) {
Interator and Iterable
Design Patterns Lecture part 1.
14. Factory Pattern SE2811 Software Component Design
14. Factory Pattern SE2811 Software Component Design
Chapter 8, Design Patterns Singleton
Presentation transcript:

CS 350 – Software Design Putting Patterns Together Let’s put a lot of patterns together. We need a lot of ducks! public interface Quackable { public void quack(); public void quack();} Some ducks that implement Quackable. public class MallardDall implements Quackable { public void quack() { public void quack() { System.out.println(“Quack”); System.out.println(“Quack”); }} public class RedheadDuck implements Quackable { public void quack() { public void quack() { System.out.println(“Quack”); System.out.println(“Quack”); }}

CS 350 – Software Design Putting Patterns Together More quackable ducks. public class DuckCall implements Quackable { public void quack() { public void quack() { System.out.println(“Kwak”); System.out.println(“Kwak”); }} public class RubberDuck implements Quackable { public void quack() { public void quack() { System.out.println(“Squeak”); System.out.println(“Squeak”); }}

CS 350 – Software Design Putting Patterns Together public class DuckSimulator { public static void main(String[] args) { public static void main(String[] args) { DuckSimulator simultor = new DuckSimulator(); DuckSimulator simultor = new DuckSimulator(); simulator.simulate(); simulator.simulate(); } void simulator() { void simulator() { Quackable mallardDuck = new MallardDuck(); Quackable mallardDuck = new MallardDuck(); Quackable redheadDuck = new RedheadDuck(); Quackable redheadDuck = new RedheadDuck(); Quackable duckCall = new DuckCall(); Quackable duckCall = new DuckCall(); Quackable rubberDuck = new RubberDuck(); Quackable rubberDuck = new RubberDuck(); System.out.println(“\nDuck Simulator”); System.out.println(“\nDuck Simulator”); simulate(mallardDuck); simulate(mallardDuck); simulate(redheadDuck); simulate(redheadDuck); simulate(duckCall); simulate(duckCall); simulate(rubberDuck); simulate(rubberDuck); void simulate(Quackable duck) { void simulate(Quackable duck) { duck.quack(); duck.quack(); }}

CS 350 – Software Design Putting Patterns Together public class Goose { public void honk() { public void honk() { System.out.println(“Honk”); System.out.println(“Honk”); }} public class Witch{ public void Complains() { public void Complains() { System.out.println(“I am not a witch, they dressed me like this!”); System.out.println(“I am not a witch, they dressed me like this!”); }}

CS 350 – Software Design Putting Patterns Together We can use an adapter public class GooseAdapter implements Quackable { Goose goose; Goose goose; public GooseAdapter(Goose goose) { public GooseAdapter(Goose goose) { this.goose = goose; this.goose = goose;} public void quack() { goose.honk(); goose.honk(); }} public class WitchAdapter implements Quackable { Witch witch; Witch witch; public WitchAdapter(Witch witch) { public WitchAdapter(Witch witch) { this.witch = witch; this.witch = witch;} public void quack() { witch.complain(); witch.complain(); }}

CS 350 – Software Design Putting Patterns Together Let’s add a goose to our simulator public class DuckSimulator { public static void main(String[] args) { public static void main(String[] args) { DuckSimulator simultor = new DuckSimulator(); DuckSimulator simultor = new DuckSimulator(); simulator.simulate(); simulator.simulate(); } void simulate() { void simulate() { Quackable mallardDuck = new MallardDuck(); Quackable mallardDuck = new MallardDuck(); Quackable redheadDuck = new RedheadDuck(); Quackable redheadDuck = new RedheadDuck(); Quackable duckCall = new DuckCall(); Quackable duckCall = new DuckCall(); Quackable rubberDuck = new RubberDuck(); Quackable rubberDuck = new RubberDuck(); Quackable gooseDuck = new GooseAdapater(new Goose()); Quackable gooseDuck = new GooseAdapater(new Goose()); System.out.println(“\nDuck Simulator”); System.out.println(“\nDuck Simulator”); simulate(mallardDuck); simulate(mallardDuck); simulate(redheadDuck); simulate(redheadDuck); simulate(duckCall); simulate(duckCall); simulate(rubberDuck); simulate(rubberDuck); simulate(gooseDuck); simulate(gooseDuck);} void simulate(Quackable duck) { void simulate(Quackable duck) { duck.quack(); duck.quack(); }}

CS 350 – Software Design Putting Patterns Together How many quacks do we have? We can decorate the ducks so they can be counted. public class QuackCounter implements Quackable { Quackable duck; Quackable duck; static int numberOfQuacks; static int numberOfQuacks; public QuackCounter (Quackable duck) { public QuackCounter (Quackable duck) { this.duck = duck; this.duck = duck;} public void quack() { duck.quack(); duck.quack(); numberOfQuacks++; numberOfQuacks++;} public static int getQuacks() { return numberofQuacks; return numberofQuacks; }}}

CS 350 – Software Design Putting Patterns Together Too many ducks, let’s create a factory! public abstract class AbstractDuckFactory { public abstract Quackable createMallardDuck(); public abstract Quackable createMallardDuck(); public abstract Quackable createRedheadDuck(); public abstract Quackable createRedheadDuck(); public abstract Quackable createDuckCall(); public abstract Quackable createDuckCall(); public abstract Quackable createRubberDuck(); public abstract Quackable createRubberDuck(); public class DuckFactory extends AbstractDuckFactory { public Quackable createMallardDuck() { public Quackable createMallardDuck() { return new MallardDuck(); return new MallardDuck(); } public Quackable createRedheadDuck() { public Quackable createRedheadDuck() { return new RedheadDuck(); return new RedheadDuck(); } public Quackable createDuckCall() { public Quackable createDuckCall() { return new DuckCall(); return new DuckCall(); } public Quackable createRubberDuck() { public Quackable createRubberDuck() { return new RubberDuck(); return new RubberDuck(); }

CS 350 – Software Design Putting Patterns Together What about the countable quackable ducks? public class CountingDuckFactory extends AbstractDuckFactory { public Quackable createMallardDuck() { public Quackable createMallardDuck() { return newQuackCounter(new MallardDuck())); return newQuackCounter(new MallardDuck())); } public Quackable createRedheadDuck() { public Quackable createRedheadDuck() { return newQuackCounter(new RedheadDuck()); return newQuackCounter(new RedheadDuck()); } public Quackable createDuckCall() { public Quackable createDuckCall() { return newQuackCounter(new DuckCall()); return newQuackCounter(new DuckCall()); } public Quackable createRubberDuck() { public Quackable createRubberDuck() { return newQuackCounter(new RubberDuck()); return newQuackCounter(new RubberDuck()); }

CS 350 – Software Design Putting Patterns Together Let’s alter the simulator to use the factory public class DuckSimulator { public static void main(String[] args) { public static void main(String[] args) { DuckSimulator simultor = new DuckSimulator(); DuckSimulator simultor = new DuckSimulator(); AbstractDuckFactory duckFactory = new CountingDuckFactory(); AbstractDuckFactory duckFactory = new CountingDuckFactory(); Simulator.simulate(duckFactory); Simulator.simulate(duckFactory); } void simulate(AbstractDuckFactory duckFactory) { void simulate(AbstractDuckFactory duckFactory) { Quackable mallardDuck = duckFactory.createMallardDuck(); Quackable mallardDuck = duckFactory.createMallardDuck(); Quackable redheadDuck = duckFactory.createRedheadDuck(); Quackable redheadDuck = duckFactory.createRedheadDuck(); Quackable duckCall = duckFactory.createDuckCall(); Quackable duckCall = duckFactory.createDuckCall(); Quackable rubberDuck = duckFactory.createRubberDuck(); Quackable rubberDuck = duckFactory.createRubberDuck(); Quackable gooseDuck = new GooseAdapater(new Goose()); Quackable gooseDuck = new GooseAdapater(new Goose()); System.out.println(“\nDuck Simulator”); System.out.println(“\nDuck Simulator”); simulate(mallardDuck); simulate(mallardDuck); simulate(redheadDuck); simulate(redheadDuck); simulate(duckCall); simulate(duckCall); simulate(rubberDuck); simulate(rubberDuck); simulate(gooseDuck); simulate(gooseDuck);} void simulate(Quackable duck) { void simulate(Quackable duck) { duck.quack(); duck.quack(); }}

CS 350 – Software Design Putting Patterns Together Managing this many ducks can be burdensome: Quackable mallardDuck = duckFactory.createMallardDuck(); Quackable mallardDuck = duckFactory.createMallardDuck(); Quackable redheadDuck = duckFactory.createRedheadDuck(); Quackable redheadDuck = duckFactory.createRedheadDuck(); Quackable duckCall = duckFactory.createDuckCall(); Quackable duckCall = duckFactory.createDuckCall(); Quackable rubberDuck = duckFactory.createRubberDuck(); Quackable rubberDuck = duckFactory.createRubberDuck(); Quackable gooseDuck = new GooseAdapater(new Goose()); Quackable gooseDuck = new GooseAdapater(new Goose()); simulate(mallardDuck); simulate(mallardDuck); simulate(redheadDuck); simulate(redheadDuck); simulate(duckCall); simulate(duckCall); simulate(rubberDuck); simulate(rubberDuck); simulate(gooseDuck); simulate(gooseDuck);

CS 350 – Software Design Putting Patterns Together Let’s create a flock of ducks. public class Flock implements Quackable{ ArrayList quackers = new ArrayList(); ArrayList quackers = new ArrayList(); public void add(Quackable quacker) { public void add(Quackable quacker) { quackers.add(quacker); quackers.add(quacker); } public void quack() public void quack() { Iterator iterator = quackers.iterator(); Iterator iterator = quackers.iterator(); while (iterator.hasNExt() { while (iterator.hasNExt() { Quack quacker = (Quackable)iterator.next(); Quack quacker = (Quackable)iterator.next(); quacker.quack(); quacker.quack(); } }} Shows two patterns that we didn’t previously mention, Composite & Iterator.

CS 350 – Software Design Putting Patterns Together Let’s alter the simulator to a flock public class DuckSimulator { // other stuff void simulate(AbstractDuckFactory duckFactory) { void simulate(AbstractDuckFactory duckFactory) { Quackable mallardDuck = duckFactory.createMallardDuck(); Quackable mallardDuck = duckFactory.createMallardDuck(); Quackable redheadDuck = duckFactory.createRedheadDuck(); Quackable redheadDuck = duckFactory.createRedheadDuck(); Quackable duckCall = duckFactory.createDuckCall(); Quackable duckCall = duckFactory.createDuckCall(); Quackable rubberDuck = duckFactory.createRubberDuck(); Quackable rubberDuck = duckFactory.createRubberDuck(); Quackable gooseDuck = new GooseAdapater(new Goose()) Quackable gooseDuck = new GooseAdapater(new Goose()) System.out.println(“\nDuck Simulator: With Compisite - Flocks”); System.out.println(“\nDuck Simulator: With Compisite - Flocks”); Flock flockOfDucks = new Flock(); Flock flockOfDucks = new Flock(); flockOfDucks.add(redheadDuck); flockOfDucks.add(redheadDuck); flockOfDucks.add(duckCall); flockOfDucks.add(duckCall); flockOfDucks.add(rubberDuck); flockOfDucks.add(rubberDuck); flockOfDucks.add(gooseDuck); flockOfDucks.add(gooseDuck); Flock flock of Mallards = new Flock(); Flock flock of Mallards = new Flock(); Quack mallardOne = duckFactory.createMallardDuck(); Quack mallardOne = duckFactory.createMallardDuck(); Quack mallardTwo = duckFactory.createMallardDuck(); Quack mallardTwo = duckFactory.createMallardDuck(); Quack mallardThree = duckFactory.createMallardDuck(); Quack mallardThree = duckFactory.createMallardDuck(); Quack mallardFour = duckFactory.createMallardDuck(); Quack mallardFour = duckFactory.createMallardDuck(); flockOfMallards.add(mallardOne);} flockOfMallards.add(mallardOne);} flockOfMallards.add(mallardTwo);} flockOfMallards.add(mallardTwo);} flockOfMallards.add(mallardThree);} flockOfMallards.add(mallardThree);} flockOfMallards.add(mallardFour);} flockOfMallards.add(mallardFour);} void simulate(Quackable duck) { void simulate(Quackable duck) { duck.quack(); duck.quack(); }}

CS 350 – Software Design Putting Patterns Together What if we also want to observer individual duck behavior? public interface QuackObservable { public void registerObeserver(Observer observer); public void registerObeserver(Observer observer); public void notifyObservers(); public void notifyObservers();} However, we coded all the Quackables differently, so what to do? What to do?

CS 350 – Software Design Putting Patterns Together What if we also want to observer individual duck behavior? public interface QuackObservable extends Quackable { public void registerObeserver(Observer observer); public void registerObeserver(Observer observer); public void notifyObservers(); public void notifyObservers();} However, we coded all the Quackables differently, so what to do? What to do? public interface QuackObserver extends Quackable { public void quack(); public void quack();}

CS 350 – Software Design Putting Patterns Together Implementing the concrete classes public class Observable implements QuackObserable { ArrayList observers = new ArrayList(); ArrayList observers = new ArrayList(); QuackObservable duck; QuackObservable duck; public Observable(QuackObservable duck) { public Observable(QuackObservable duck) { this.duck = duck; this.duck = duck; } public void registerObserver(Observer observer) { public void registerObserver(Observer observer) { observers.add(observer); observers.add(observer); } public void notifyObservers() { public void notifyObservers() { Iterator iterator = observers.iterator(); Iterator iterator = observers.iterator(); while (iterator.hasNext()) { while (iterator.hasNext()) { Observer observer = (Observer) iterator.next(); Observer observer = (Observer) iterator.next(); observer.update(duck); observer.update(duck); } }}

CS 350 – Software Design Putting Patterns Together Changing the Mallard Duck class public class MallardDall implements Quackable { Observable observable; Observable observable; public MallardDuck() { public MallardDuck() { observable = new Observable(this); observable = new Observable(this); } public void quack() { public void quack() { System.out.println(“Quack”); System.out.println(“Quack”); notifyObservers(); notifyObservers(); } public void registerObserver(Observer observer) { public void registerObserver(Observer observer) { observable.registerObserver(observer); observable.registerObserver(observer); } public void notifyObservers() { public void notifyObservers() { observable.notifyObservers(); observable.notifyObservers(); }}

CS 350 – Software Design Putting Patterns Together From the Observer side public interface Observer { public void update(QuackObservable duck); public void update(QuackObservable duck);} public class Quackologist implements Observer { public void update(QuackObservable duck) { public void update(QuackObservable duck) { System.out.println(“Quackologist: “ + duck + “ just quacked.”); System.out.println(“Quackologist: “ + duck + “ just quacked.”); }}

CS 350 – Software Design Putting Patterns Together The updated simulator public class DuckSimulator { // other stuff void simulate(AbstractDuckFactory duckFactory) { void simulate(AbstractDuckFactory duckFactory) { // create duck factories and flock here // create duck factories and flock here System.out.println(“\nDuck Simulator: With Observer”); System.out.println(“\nDuck Simulator: With Observer”); Quackologist quackologist = newQuackologist(); Quackologist quackologist = newQuackologist(); flockOfDucks.registerObserver(quackologist); flockOfDucks.registerObserver(quackologist); simulate(flockOfDucks); simulate(flockOfDucks); System.out.println(“\nThe ducks quacked “ + QuackCounter.getQuacks() + “ times”); System.out.println(“\nThe ducks quacked “ + QuackCounter.getQuacks() + “ times”); void simulate(Quackable duck) { void simulate(Quackable duck) { duck.quack(); duck.quack(); }}