Download COP2212 Intro. to Programming in C

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
CS 4240
Principles of SW Design
More design principles
LSP, OCP, DIP, …
And another pattern
Decorator
© 2007 T. Horton
F-1
Well-known Design Principles
• Liskov Substitutability Principle
• Open-Closed Principle (OSP)
• Dependency Inversion Principle (ISP)
F-2
Substitutability
• Liskov Substitutability Principle:
– “Wherever we see a reference to an abstract object in
our code, we can legally replace that with a reference to
any subclass object.”
– Or another way: subclasses should always be
substitutable for their base classes.
• All about inheritance and “general” references
– Implies that we can “use” the subclass object in any way
that’s legal for the superclass
– Formal definition of IS-A (isn’t it?)
• Use it to evaluate your use of inheritance
F-3
Dependency Inversion Principle
• DIP says
– High level modules should NOT depend on lowlevel modules.
All modules should depend on abstractions
– Abstractions should not depend on details.
Details should depend on abstractions.
• Another way to say it:
– Depend on abstractions, not concrete things.
F-4
OO Principle: Open-Closed Principle
• The Open-Closed Principle (OCP)
– Classes should be open for extension, but
closed for modification.
• Don’t allow clients to alter your code.
• Allow clients to easily add things to your
classes.
– Provide means of extension
• Example of this: the Observer design pattern
• Note there’s a cost to making classes
extendable
F-5
Lots in Common Here
• First, these are formal “principles” for other
principles we talked about
– Or closely related ones
• Second, some of these are related
– OCP is a goal
– DIP is a way of helping you reach that goal
F-6
Another Design Problem, Another
Pattern
• You’re doing Beverages for a coffee shop
• Four types of coffee-drink:
– HouseBlend, DarkRoast, Decaf, Espresso
• Also can add (for a cost):
– SteamedMilk, Soy, Mocha, WhippedMilk
• Want a cost() method in each class to calculate costs
• Question: how to structure classes for this?
– Avoid class explosion. Same solution as for Customer
and Accounts? Need a Bridge?
F-7
One Solution
• Beverage abstract super-class
– Subclasses: HouseBlend, DarkRoast, Decaf,…
• Fields / Attributes:
– milk, soy, mocha, whip
• Methods / Operations:
– hasMilk(), setMilk(); hasSoy(), setSoy(); …
– cost()
• Issues?
F-8
Problems with This Approach
• Price for condiments? Alter existing code
• New condiments? Add methods; alter cost()
operation in superclass
• New beverage like ice tea that shouldn’t have
whipped milk?
• Want a double mocha?
F-9
Decorator Design Pattern
• “Decorate” an object
– Wrappers: a object defined so that it encloses
another object
• Key points:
– Decorators have the same supertype as the
object they wrap.
So you can use a decorated object in the same
place as the original object (a la Liskov)
– Can use more than one decorator on an object
– Can decorate objects at run-time
F-10
Decorators in Java I/O
• Used for input and output file streams
• Many stream types are wrappers
– Add extra functionality, e.g. push-back, line-numbering,
buffering, etc.
– Create by using “more basic” file-stream object in
constructor
– Can used a wrapped-stream where you’d use any stream
• See Java API:
http://java.sun.com/j2se/1.4.2/docs/api/java/io/FilterInp
utStream.html
• Also used in Java Swing
F-11
Decorators in Java I/O
FileInputStream istream = new FileInputStream(“foo.txt”);
BufferedInputStream bstream =
new BufferedInputStream(istream);
F-12
Issues with Decorators
• Disadvantages:
– May add many classes, makes package hard to
understand
• Like Java I/O streams
– Client code should not rely on knowing a
reference’s specific concrete class
• May get wrapped. Wrapping intended to
transparent to client code.
– Creating new objects could be more complex
• A factory class may help
F-13
Swing Examples of Decorators
• Example 1: Yikes -- dead link now -- never mind
Button with a diagonal line
– http://www.ideas2work.com/decorator-java.html
– Note: quick read, but not a lot of explanation of Swing and
how buttons are drawn or components
• Example 2 & 3: Component border, minimize
–
http://www.onjava.com/pub/a/onjava/2003/02/05/decorator.html?page=1
– Better explanation, especially of
• Decorator pattern
• Inheritance vs. decoration
• how components are
composed and painted in Swing
F-14