1. Design a Search interface that declares methods for searching an item in a list. Design and implement two implementers — BinarySearch and LinearSearch — to conduct a binary and linear search of the list, respectively.
2. Design an AddressValidator interface that declares methods for validating different parts of a given address. Design and implement two implementer classes — USAddress and THAddress — to validate a given U.S. and Canadian address, respectively.
3. Design an application to allow different customers to buy airline tickets. Apply the Read-Write Lock pattern to ensure that multiple customers are allowed to check the seat availability on the same flight, but only one customer is allowed to buy the ticket at a time.
4. Design an application to allow different customers to bid on auctioned items. Apply the Read-Write Lock pattern to ensure that multiple customers are allowed to check the current bid but no two customers are allowed to alter the bid amount at the same time.