960 likes | 2.07k Views
Applying GOF Design Patterns . Chapter 26 Applying UML and Patterns Craig Larman Presented By : Naga Venkata Neelam. Objectives. Apply GRASP and GOF design patterns to the design of NextGen case study. Introduction. The following GOF design patterns are
E N D
Applying GOF Design Patterns Chapter 26 Applying UML and Patterns Craig Larman Presented By : Naga Venkata Neelam
Objectives • Apply GRASP and GOF design patterns to the design of NextGen case study.
Introduction • The following GOF design patterns are explored in the subsequent sections : • Adapter • Analysis • Factory • Singleton • Strategy • Composite
Adapter(GOF) • Context/problem • How to resolve incompatible interfaces or provide a stable interface to similar components with different interfaces? • Solution • Convert the original interface of a component into another interface through an intermediate adapter object.
The Adapter Pattern • Adapters use interfaces and polymorphism to add a level of indirections to varying APIs in other components.
Using An Adapter • Protected Variations, Low Coupling, Polymorphism,Indirection helps us to view through the myriad details and see the essential alphabet of design techiques being applied. • Naming Convention has the advantage of easily communicating to others reading the code or diagrams what design patterns are being used.
Analysis Discoveries During Design:Domain Model • In addition to being a newly created software class in the Design Model, this is a domain concept. • The following figure illustrates the updated Domain Model.
Note • The architecture of the Design Model will usually be organized into layers.One of these layers of design classes will be called “Domain layer”. • It will contain software classes whose names and structure take inspiration from the domain vocabulary and concepts.
Factory(GOF) • Context/Problem • Who should be responsible for creating objects when there are special considerations, such as complex logic,a desire to separate the creation responsibilities for better cohesion, and so forth • Solution • Create a Pure Fabrication object called a Factory that handles the creation
Solution(2) • Showing a pseudo code allows one to include dynamic algorithm details on a static class diagram such that it may lessen the need for interaction diagrams.
Advantages of Factory Objects • Separate the responsibility of complex creation into cohesive helper objects. • Hide potentially complex creation logic • Allow introduction of performance-enhancing memory management strategies,such as object caching or recycling.
Singleton(GOF) • The Factory raises a new problem in the design: • Who creates the factory itself? • How is it accessed? • One solution is pass the Factory instance around as a parameter to wherever a visibility need is discovered for it, or to initialize the objects that need visibility to it,with a permanent reference. • Alternative is Singleton pattern.
Solution • Define a static method of the class that returns the singleton. • With this approach, a developer has global visibility to this single instance,via the static getInstance method of the class.
Visibility to Single Instance public class Register { public void initialize() {… do some work… //accessing the singleton Factory via the getInstance call AccountingAdapter = ServiceFactory.getInstance().getAccountingAdapter(); …do some work…} //other methods…}
Lazy Initialization public static synchronized ServiceFactory getInstance() { if(instance==null) { //critical section if multithreaded application instance = new ServicesFactory(); } return instance }
Eager Initialization public class ServiceFactory { //eager initialization private static ServicesFactory instnace = new ServicesFactory(); public static servicesFactory getInstance() { Return instance; } //other methods… }
Reasons to prefer lazy Initialization • Creation work is avoided, if the instance is never actually accessed. • The getInstance lazy initialization sometimes contains complex and conditional creation logic.
Preferred Methods • Instance-side methods permit subclassing and refinement of the singleton class into subclasses. • Most object-oriented remote communication mechanisms only support remote-enabling of instance methods,not static methods. • A class is not always a singleton in all application contexts.
Conclusion of External services with varying Interfaces Problem
Strategy(GOF) • Context/Problem • How to design for varying, but related,algorithms or policies? • How to design for the ability to change these algorithms or policies • Solution • Define each algorithm/policy/strategy in a separate class, with a common interface
Strategy In Collaboration • A strategy object is attached to a context object- the object to which it applies the algorithm. • In this example the context object is a sale.
Creating a strategy with a factory • There are different pricing algorithms or strategies, and they change over time. • Who should create the strategy? • A straight forward approach is to apply the Factory pattern again: a PricingstrategyFactory can be responsible for creating all strategies needed by the application.
Context objects needs attribute visibility to its strategy • The reference in the sale will be declared in terms of the interface,not a class, so that any implementation of the interface can be bound to the attribute. • It is not desirable to cache the created strategy instance in a field of the PricingstrategyFactory, but rather to re-create one each time,by reading the external property for its class name, and then instantiating the strategy.
Creating a Strategy(2) • Protected Variations with respect to dynamically changing pricing policies has been achieved with the Strategy and Factory patterns. • Strategy builds on Polymorphism and interfaces to allow pluggable algorithms in an object design.
Composite(GOF) and other Design Principles • Context/Problem • How to treat a group or composition of objects the same way(polymorphically) as a non-composite(atomic object)? • Solution • Define classes for composite and atomic objects so that they implement the same interface.
Understanding composite (GOF) with an example • Suppose a store has the following policies in effect for a particular day: • 20% senior discount policy. • Preferred customer discount of 15% off sales over $400. • On day,there is $50 off purchases over $500. • Buy 1 case of Darjeeling tea, get 15% discount off of everything.
Problem • Suppose a senior who is also a preferred customer buys 1 case of Darjeeling tea, and $600 of veggieburgers. • What pricing policy should be applied?
Solution using conflict resolution strategy • In this strategy a store applies the following: • Best for the customer (lowest price) • Highest pricing strategy (during a difficult financial period)
Multiple Co-Existing Strategies • One sale may have several pricing strategies • Pricing strategy can be related to the type of customer • Pricing strategy can be related to the type of product being brought
Multiple co-existing strategies(2) • The ProductSpecification must be known by the StrategyFactory at the time of creation of a pricing strategy influenced by the product. • Is there a way to change the design so that the Sale object does not know if it is dealing with one or many pricing strategies, and offer a design for the conflict resolution? • And the answer is yes,with the composite pattern.
Signature feature of Composite Object • In composite pattern,the composite classes such as CompositeBestForCustomerPricingStrategy inherit an attribute pricingStratagies that contains a list of more ISalePricingStrategy objects. • The outer composite objects contains a list of inner objects, and both the outer and inner objects implement the same interface.
Collaboration with a Composite • In this the Sale does not know or care if its pricing strategy is an atomic object or a composite strategy that is it looks the same to the Sale object.
Object Code for CompositePricing Strategy //Super class so all subclasses can inherit a List of startegies public abstract class CompositePricingStrategy implements ISalePricingStrategy { protected List pricingStrategies = new ArrayList(); public add(ISalePricingStrategy s){ pricingStrategies.add(s);} public abstract Money getTotal(Sale sale); } // end of class
Object Code for CompositePricing Strategy (2) // a composite Strategy that returns the lowest total // of its inner SalePricingStrategies public class CompositeBestForCustomerPricingStrategy extends CompositePricingStrategy { public Money getTotal(Sale sale){ Money lowestTotal = new Money(Integer.MAX_VALUE); //iterate over all the inner strategies
Object Code for CompositePricing Strategy (3) for(Iterator i= pricingStrategies.iterator(); i.hasNext();){ ISalePricingStrategy strategy = (ISalePricingStrategy)i.next(); Money total = strategy.getTotal(sale); lowestTotal = total.min(lowestTotal); } return lowestTotal; } }//end of class
Creating Multiple SalePricingStrategies • There are three points in the scenario where pricing strategies may be added to the composite: • Current store-defined discount,added when the sale is created. • Customer type discount,added when the customer type is communicated to the POS. • Product type discount added when the product is entered to the sale.
Creating a Process sale for the second case • Use case UCI: Process Sale • Extensions (or Alternative Flows) Customer says they are eligible for a discount (e.g employee, preferred customer) • Cashier signals discount request. • Cashier enters Customer identification • System presents discount total, based on discount rules.
Considering GRASP and Other principles in the Design • An ID is given to the customer • Transform the customer ID to a Customer object. • Pass aggregate Object as Parameter.
Note • Although this application of composite was to a strategy family, the Composite pattern can be applied to other kinds of objects • For example, it is common to create "macro commands " - commands that contain other commands -through the use of Composite.
Note(2) • Composite is often used with the Strategy and Command Patterns. • Composite is based on Polymorphism and provides Protected Variations to a client so that it is not impacted if its related objects are atomic or composite.
Facade(GOF) • Context/Problem • A common, unified interface to a disparate set of implementations or interfaces- such as within a subsystem-is required.There may be undesirable coupling to many things in the subsystem, or the implementation of the subsystem may change.What to do?