June 19, 2013
Hot Topics:
RSS RSS feed Download our iPhone app

Working with Design Pattern: Decorator, Page 2

  • July 18, 2007
  • By Jeff Langr
  • Send Email »
  • More Articles »

Creating Additional Decorators

I can quickly bang out more decorators. How about the capability to send a duplicate (not a CC or BCC) of the email to another recipient? Here's a test:

import static org.junit.Assert.*;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

import org.junit.*;

public class DuplicatingEmailTest {
   @Test
   public void create() throws AddressException,
      MessagingException {
      final Set<String> sentEmails = new HashSet<String>();
      Sendable wrappedEmail = new Email() {
         @Override
         public void send(String to, String from, String subject,
            String content) {
            sentEmails.add(to);
         }
      };
      DuplicatingEmail email =
         new DuplicatingEmail(wrappedEmail, "jeff@langrsoft.com");
      email.send("joe@x.com", "from", "subject", "content");
      assertEquals(2, sentEmails.size());
      assertTrue(sentEmails.contains("joe@x.com"));
      assertTrue(sentEmails.contains("jeff@langrsoft.com"));
   }
}

And the implementation:

import javax.mail.*;
import javax.mail.internet.*;

public class DuplicatingEmail implements Sendable {
   private Sendable wrappedEmail;
   private final String additionalAddress;

   public DuplicatingEmail(Sendable wrappedEmail,
      String additionalAddress) {
      this.wrappedEmail = wrappedEmail;
      this.additionalAddress = additionalAddress;
   }

   public void send(
         String toAddress, String fromAddress, String subject,
         String content)
         throws AddressException, MessagingException {
      wrappedEmail.send(toAddress, fromAddress, subject, content);
      wrappedEmail.send(additionalAddress, fromAddress, subject,
                        content);
   }
}

With two decorators defined, the client code can choose how to wrap Sendable implementations:

Sendable sendable =
   new DuplicatingEmail(new CensoringEmail(new Email()), "Me@z.com");
sendable.send("jane@x.com", "Joe@z.com", "yo", "the text");

The decorator pattern allows for considerable flexibility. As demonstrated here, its most useful application is when you have many potential subclasses that would create a very large number of potential combinations: DuplicatingCensoringEmail, CensoringAttachmentVerifyingEmail, and so on.



Click here for a larger image.

Figure 1: The decorator pattern.

Reference

[Gamma] Gamma, E., et. al. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley Professional, 1995.

About the Author

Jeff Langr is a veteran software developer celebrating his 25th year of professional software development. He's authored two books and dozens of published articles on software development, including Agile Java: Crafting Code With Test-Driven Development (Prentice Hall) in 2005. You can find out more about Jeff at his site,or you can contact him via email at jeff at langrsoft.com.




Comment and Contribute

 


(Maximum characters: 1200). You have characters left.

 

 


Networking Solutions
Sitemap | Contact Us

Rocket Fuel