Slide 1

Slide 1 text

Dr. Javier Gonzalez-Sanchez javiergs@calpoly.edu www.javiergs.info o ffi ce: 14 -227 CSC 305 Individual Software Design and Development Lecture 13. Builder + Chain of Responsibilities

Slide 2

Slide 2 text

Previously

Slide 3

Slide 3 text

GoF Patterns 3

Slide 4

Slide 4 text

Fluent-Builder

Slide 5

Slide 5 text

Fluent-Builder • The Fluent Builder is a builder whose design relies on method chaining. In doing so, it a ims to promote code legibility. 5

Slide 6

Slide 6 text

UserPro f ile class UserProfileBuilder { private final String username; private String email = "Not provided"; private String phoneNumber = "Not provided"; private String address = "Not provided"; private int age = 18; public UserProfileBuilder(String username) { this.username = username; } public UserProfileBuilder email(String email) { this.email = email; return this; } 6

Slide 7

Slide 7 text

UserPro f ile public UserProfileBuilder phoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; return this; } public UserProfileBuilder address(String address) { this.address = address; return this; } public UserProfileBuilder age(int age) { if (age < 13) throw new IllegalArgumentException("Age must be 13 or older."); this.age = age; return this; } public UserProfile build() { return new UserProfile(username, email, phoneNumber, address, age); } } 7

Slide 8

Slide 8 text

UserPro f ile class UserProfile { private final String username; private final String email; private final String phoneNumber; private final String address; private final int age; public UserProfile(String username, String email, String phoneNumber, String address, int age) { this.username = username; this.email = email; this.phoneNumber = phoneNumber; this.address = address; this.age = age; } public String toString() { return String.format( "UserProfile: { Username: %s, Email: %s, Phone: %s, Address: %s, Age: %d }", username, email, phoneNumber, address, age ); } } 8

Slide 9

Slide 9 text

FluentBuilderExample public class FluentBuilderExample { public static void main(String[] args) { // Example 1: Creating a user in a single line UserProfile user1 = new UserProfileBuilder("alice123") .email("alice@example.com") .phoneNumber("555-1234") .address("123 Main St, NY") .age(25) .build(); // Example 2: Building the object step by step UserProfileBuilder builder = new UserProfileBuilder("bob456"); builder.email("bob@example.com").phoneNumber("555-5678"); UserProfile user2 = builder.address("456 Elm St, LA").age(30).build(); System.out.println(user1); System.out.println(user2); } } 9

Slide 10

Slide 10 text

Another Fluent-Builder

Slide 11

Slide 11 text

Fluent-Builder import java.awt.*; public class Client { public static void main(String[] args) { FluentBuilder builder = new BoxFluentBuilder() .setColor(Color.RED) .setSize(20) .setX(10) .setY(20); Product box = ((BoxFluentBuilder)builder).get(); } } 11

Slide 12

Slide 12 text

Fluent-Builder import java.awt.Color; public interface FluentBuilder { public Builder setColor(Color color); public Builder setSize(int size); public Builder setX(int x); public Builder setY(int y); } 12

Slide 13

Slide 13 text

Fluent-Builder import java.awt.*; public class BoxFluentBuilder implements FluentBuilder { private Color color; private int size, x, y; public Builder setColor (Color color) { this.color = color; return this; } public Builder setSize(int size) { this.size = size; return this; } public Builder setX(int x) { this.x = x; return this; } public Builder setY(int y) { this.y = y; return this; } public Box get() { return new Box (color, size, x, y); } } 13

Slide 14

Slide 14 text

Chain of Responsibility

Slide 15

Slide 15 text

Chain of Responsibility • Avoid coupling the sender of a request to its receiver by giving more th a n one object a ch a nce to h a ndle the request. 15

Slide 16

Slide 16 text

Chain of Responsibility 16

Slide 17

Slide 17 text

Chain of Responsibility vs Composite vs Decorator 17

Slide 18

Slide 18 text

Chain of Responsibility // Setup Chain of Responsibility Handler h1 = new ConcreteHandler2(); Handler h2 = new ConcreteHandler2(); Handler h3 = new ConcreteHandler1(); h1.setSuccessor(h2); h2.setSuccessor(h3); // Generate and process request int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 }; foreach (int i=0; i

Slide 19

Slide 19 text

Handler abstract class Handler { public abstract void handleRequest(int request); } class ConcreteHandler1 extends Handler { public void handleRequest(int request) { if (request >= 0 && request < 10) { // code here… } else { // nothing can be done :( } } } 19

Slide 20

Slide 20 text

Handler class ConcreteHandler2 extends Handler { protected Handler successor; public void setSuccessor(Handler successor) { this.successor = successor; } public override void handleRequest(int request) { if (request >= 10 && request < 20) { // code here } else if (successor != null) { successor.handleRequest(request); } } } 20

Slide 21

Slide 21 text

Example 21 The Logger Case

Slide 22

Slide 22 text

Questions 22

Slide 23

Slide 23 text

Lab

Slide 24

Slide 24 text

Example 24 Lab Instructions Provided on Paper

Slide 25

Slide 25 text

CSC 305 Individual Software Design and Development Javier Gonzalez-Sanchez, Ph.D. javiergs@calpoly.edu Winter 2025 Copyright. These slides can only be used as study material for the class CSC305 at Cal Poly. They cannot be distributed or used for another purpose.