design patterns

Post on 26-Nov-2014

444 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

1

Design Patterns(source: Core J2EE Patterns

written by Alur, Crupi, Malks)

2

Sang Shinsang.shin@sun.com

Technology EvangelistSun Microsystems, Inc.

3

Agenda● Presentation tier design patterns● Business tier design patterns● Integration tier design patterns

4

J2EE Pattern Catalog

Core J2EE Patterns

5

Three Tiers

PresentationTier

BusinessTier

IntegrationTier

6

Presentation-Tier Patterns

● Intercepting Filter

● Front Controller

● View Helper

● Composite View

● Service to Worker

7

Business-Tier Patterns● Business Delegate● Service Locator● Session Facade● Data Transfer Object (DTO)

– (was Value Object)

● Data Transfer Object Assembler – (was Value Object Assembler)

● Composite Entity● Value List Handler

8

Integration-Tier Patterns

● Connector● Data Access Object● Service Activator

9

Presentation-TierDesign Patterns

10

Presentation Tier Processing

Client Business Service

ControlLogic Display

InterceptingFilter

Pre/Post-Processor

11

Intercepting Filter: Forces

● Each service request and response requires common pre-processing and post-processing– logging, authentication, caching, compression,

data transformation

● Adding and removing these “pre” and “post” processing components should be flexible– deployment time installation/configuration

12

Intercepting Filter: Solution

● Create pluggable and chainable filters to process common services such that– Filters intercept incoming and outgoing requests

and responses– Flexible to be added and removed without

requiring changes to other part of the application● Examples– Servlet filters for HTTP requests/responses– Message handlers for SOAP requests/responses

13

Intercepting Filter: Class Diagram

Consumer

Service request intercepted by FilterManager

FilterManager

FilterChain

Target_Resource

Filter Two

Filter One

14

Intercepting Filter PatternSequence Diagram

Consumer SecurityFilter CompressionFilter LoggingFilter FrontController

Incoming Request

Apply

Forward request

Complete Request Processing

Forward request

Apply

Response

ApplyForward response

ApplyOutgoing response

15

Intercepting Filter PatternSample code for writing Servlet 2.3 Filter

Sample Deployment DescriptorPublic final class SecurityFilter implements Filter{public void doFilter(ServletRequest req,

ServletResponse res, FilterChain chain) throws IOException, ServletException{

// Perform security checks here.....

// Complete the filter processing by either passing the control // to the next servlet filter in chain or to the target URI.

chain.doFilter(modified_req, modified_res);}

}

<filter-mapping><filter-name>SecurityFilter</filter-name><servlet-name>ControllerServlet</servlet-name>

</filter-mapping>

16

Presentation Tier Processing

Client Business Service

ControlLogic Display

InterceptingFilter

Front Controller

Pre/Post-Processor

17

Front Controller: Forces● There is a need for centralized controller for

view selection and navigation (Model 2)– based on user entered data– business logic processing– client type

● Common system services are typically rendered to each request, so having a single point of entry is desirable– Example: Authentication, authorization, Logging– Can leverage filter pattern

18

Front Controller: Solution● Use a controller as an centralized point of

contact for all requests– Promote code reuse for invoking common system

services● Can have multiple front controllers, each

mapping to a set of distinct services● Works with other patterns– Filter, Command, Dispatcher, View Helper

19

Front Controller:Implementation Strategy

ConsumerSends Service request

Controller

<<Servlet Front Strategy>>ServletController

<<JSP Front Strategy>>JSPController

20

Front Controller Sample CodeServlet-based Implementation

Sample Deployment DescriptorPublic class EmployeeController extends HttpServlet{

//Initializes the servletpublic void init(ServletConfig config) throws ServletException{

super.init(config);}//Destroys the servletpublic void destroy(){}

//Handles the HTTP GET Requestsprotected void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, java.io.IOException{

processRequest (request, response);}

//Handles the HTTP POST Requestsprotected void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException{

processRequest (request, response);}

21

Front Controller Sample CodeServlet Front Controller with Command Pattern

Sample Deployment Descriptor//Processes requests for HTTP Posts and Getsprotected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ String resultPage;

// Create a RequestHelper object that represent the client request specific information RequestHelper reqHelper = new RequestHelper(request);

/******************************************************************** * Create a Command object. Command object is an implementation of the Command * Pattern. Behind the scenes, implementation of getCommand() method would be like * Command command = CommandFactory.create(request.getParameter("op")); ********************************************************************/ Command command= reqHelper.getCommand();

// Command performs the actual operation resultPage = command.execute(request, response);

// Dispatch control to the view dispatch(request, response, resultPage);}

22

Front Controller Sample CodeServlet Front Strategy with Dispatch Pattern

Sample Deployment Descriptor//Implement the dispatch methodprotected void dispatch(HttpServletRequest request,

HttpServletResponse response, String page) throws ServletException, IOException {

RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(page);

dispatcher.forward(request, response);}

}

23

Business-TierDesign Patterns

24

Business Delegate Pattern:Forces● Business service interface (Business service

APIs) change as business requirements evolve

● Coupling between the presentation tier components and business service tier (business services) should be kept to minimum

● It is desirable to reduce network traffic between client and business services

25

Business Delegate Pattern:Solution

● Use a Business Delegate to– Reduce coupling between presentation-tier

and business service components– Hide the underlying implementation details

of the business service components– Cache references to business services

components– Cache data– Translate low level exceptions to application

level exceptions

26

Business Delegate Pattern:Class Diagram

BusinessDelegateUses

BusinessService

LookupService

1 1..*

Lookup / create

27

Business Delegate PatternSequence Diagram

Client BusinessDelegate

LookupService

BusinessService

1. Create1.1 Get service

1.1.1 Lookup1.1.2 Return business service

2. Invoke2.1 Invoke

2.2 Invoke

28

Business Delegate PatternImplementation Strategies● Delegate Adapter Strategy– Integrating two disparate systems require an

Adapter● ex) Adaptor changes XML request to native

request

● Delegate Proxy Strategy– Business Delegate proxies to the Session bean it is

encapsulating– May cache necessary data such as home or remote

object handles to improve performance

29

Business Delegate PatternSample Code using Delegate Proxy

public class ResourceDelegate{

// Reference to Session facade EJB objectprivate ResourceSession objResourceSession;

// Session facade's home object classprivate static final Class homeClass

= myExamples.resourcesession.ResourceSessionHome.class;

// Default constructor. Looks up Session facade home object // and then creates Session facade EJB object

public ResourceDelegate() throws ResourceException{try{

ResourceSessionHome resourceSessionHome = (ResourceSessionHome)ServiceLocator.getInstance().getHome(

"Resource", homeClass);objResourceSession = resourceSessionHome.create();

}catch(ServiceLocatorException ex){//Translate ServiceLocator Exception into an Application Exceptionthrow new ResourceException(...);

} ...

30

Business Delegate PatternSample Code using Delegate Proxy

// Another constructor that accepts a Handle ID and reconnects to the a priori // obtained session bean instead of creating new one

public ResourceDelegate(String id) throws ResourceException{super();reconnect(id);

}

// Method to reconnect using Session facade EJB objectpublic void reconnect(String id) throws ResourceException{

try{//Obtain an instance of ServiceLocator objectServiceLocator objServiceLocator = ServiceLocator.getInstance();

// Obtain the service that corresponds to the given ID. Each ID // corresponds to serialized EJBObject handle

objResourceSession = (ResourceSession)ServiceLocator.getService(id);

}catch(ServiceLocatorException ex){//Translate the Remote Exception into an Application Exceptionthrow new ResourceException(...);

}}

31

Business Delegate PatternSample Code using Delegate Proxy

// Business methods proxied to the Session Facade. If any service exception arises, these methods// convert them into application specific exceptions such as ResourceException, SkillSetException, etc.public ResourceVO setCurrentResource(String resourceId) throws ResourceException{

try{return objResourceSession.setCurrentResource(resourceId);

}catch(RemoteException ex){throw new ResourceException(...);

}}

public ResourceVO getResourceDetails() throws ResourceException{try{

return objResourceSession.getResourceDetails();}catch(RemoteException ex){

throw new ResourceException(...);}

}

//Remaining proxy methods to session facade ResourceSession...

}

32

Service Locator Pattern:Forces

● Service lookup and creation involves complex interfaces and network operations– JNDI operation is complex

● ex) PortableRemoteObject.narrow(.., ..)

● Service lookup and creation operations are resource intensive and redundant– Getting JNDI context

33

Service Locator Pattern:Solution

● Use a Service Locator to– Abstract naming service usage– Shield complexity of service lookup and

creation– Enable optimize service lookup and creation

functions

● Usually called within Business Delegate object

34

Service Locator Pattern:Class Diagram

ClientComponent

UsesServiceLocator

BusinessService

1 1..*

Lookup / create

<<Singleton>>

Uses

UsesCreates

Uses

Uses

InitialContext

Lookup

ServiceFactory

35

Service Locator Pattern:Sequence Diagram

Client ServiceLocator InitialContext ServiceFactory BusinessService

1. Get Instance 1.1 Create

2. Get Service2.1. Lookup

2.1.1 Create2.1.2 Return EJBHome

2.2 Get Service2.2.1 Creates

2.3 Return service

36

Service Locator Pattern:Implementation Strategies● Implementation strategies for Service

Locator– EJB Service Locator Strategy– JMS Queue Service Locator Strategy– JMS Topic Service Locator Strategy– Combined EJB and JMS Service Locator Strategy

37

Service Locator PatternSample code using EJB Service Locatorpublic class ServiceLocator{

private static ServiceLocator me;InitialContext context = null;

private ServiceLocator() throws ServiceLocatorException{try{

context = new InitialContext();}catch(NamingException ex){

throw new ServiceLocatorException(...);}

}

// Returns the instance of ServiceLocator class (singleton)public static ServiceLocator getInstance() throws ServiceLocatorException{

if (me == null){me = new ServiceLocator();

}return me;

}

38

Service Locator Pattern: Sample code using EJB Service Locator Strategy

// Convert the given string into EJB Handle and then to EJB Objectpublic EJBObject getService(String Id) throws ServiceLocatorException{

if (Id == null){throw new ServiceLocatorException(...);

}

try{byte[] bytes = new String(Id).getBytes();InputStream io = new ByteArrayInputStream(bytes);ObjectInputStream is = new ObjectInputStream(io);javax.ejb.Handle handle = (javax.ejb.Handle)is.readObject();return handle.getEJBObject();

}catch(Exception ex){throw new ServiceLocatorException(...);

}}

// Returns the string Id that represents the given EJBObject's handle // in serialized format

public String getId(EJBObject session) throws ServiceLocatorException{...

}

39

Service Locator PatternSample code using EJB Service Locator Strategy

// Converts the serialized string into EJBHandle and then to EJBObjectpublic EJBHome getHome(String name, Class homeClass)

throws ServiceLocatorException{try{

Object objRef = context.lookup(name);EJBHome home

= (EJBHome)PortableRemoteObject.narrow(objRef, homeClass);

return home;}catch(NamingException ex){

throw new ServiceLocatorException(...);}

}

// Other methods pertaining to getting service using a string ID or // getting a string ID based on the given service

...}

40

Service Locator PatternClient code using EJB Service Locator

public class SampleServiceLocatorClient{public static void main(String[] args){

ServiceLocator objServiceLocator = ServiceLocator.getInstance();try{

ResourceSessionHome objResourceSessionHome = (ResourceSessionHome)objServiceLocator.getHome(

myExamples.resourcesession.ResourceSessionHome.class);}catch(ServiceLocatorException ex){

// Client handles exception...

}}

}

41

Ways to use Patterns● 1. Building new architectures

● 2. Analyzing existing architectures

● 3. Refactoring existing architectures

● 4. Evangelizing Technology using patterns

1

2

3

4

42

Building New Architectures: eBay.com

Client

Request Handler

Navigation & Dispatch

Service Interface

View Processor

Request

ResponseXML

XSL

BusinessService

Build

43

eBay.Com: Decomposition

Client

Request Handler

CommandProcessor

Pre & PostProcessor

RequestProcessor

Navigation & Dispatch

Navigator RequestDispatcher

Service Interface

View Processor

View Preparer View Creator

Request

ResponseXML

XSL

BusinessService

1Build

44

eBay.com: Applied Patterns

Client

Request Handler

Navigation & Dispatch

Service Interface

View Processor

Request

Response XML

XSL

BusinessService

InterceptingFilter Command Business

Delegate

Service Locator

Front Controller

DispatcherNavigator

Transformer Helper

InterceptingFilter

Core J2EEPattern

Strategy

View Processor

1Build

45

Analyzing Existing Architectures: Struts Framework

Client

Action Servlet

Action Mapping Action

ActionForward

ActionFormJSP View

Request

Response

uses

Anlyz

46

Struts: Patterns Implemented

Client

Action Servlet

Action Mapping Action

ActionForward

ActionFormJSP View

Request

Response

uses

Front Controller Command

View HelperCompositeView

Anlyz

47

Refactoring Existing Architectures: Ford

Servlet Loader Request ManagerSession

Context

Request Response

Refac

48

Ford: No clear responsibilities

Servlet Loader Request ManagerSession

Context

Request Response

What does this do?

What is it managing?

These are not what you think they are...

Leave 'em alone!

Refac

49

Ford: Refactored Solution

Front Controller Command FactorySession

Context

Control Command

View Command

Response Wrapper

Request Wrapper

Business Delegate

View HelperBean

Request HelperWe know what this does now!

Extensible, reusable, pluggable commands!

Clear responsibilities

Refac

Customized wrappers

50

Thank You!

top related