Challenge: Solution Review

This lesson will explain the solution to the problem from the last coding challenge.

We'll cover the following

Solution #

class LibraryKiosk{
open(app){
console.log(`Opening ${app}`)
}
connectTo(website)
{
console.log("Connecting to "+ website);
}
}
class ProxyLibraryKiosk{
constructor(){
this.libraryKiosk = new LibraryKiosk()
this.blockedSites = ["fb.com", "instagram.com","snapchat.com","google.com", "gmail.com"]
this.blockedApps = ["camera", "photos", "music", "settings"]
}
open(app){
if(this.blockedApps.includes(app)){
console.log(`You can't access the ${app}`)
}else{
this.libraryKiosk.open(app)
}
}
connectTo(website){
if(this.blockedSites.includes(website)){
console.log(`Access to ${website} denied`)
}else{
this.libraryKiosk.connectTo(website)
}
}
}
var libraryKiosk = new ProxyLibraryKiosk();
libraryKiosk.open("photos")
libraryKiosk.open("Chrome")
libraryKiosk.connectTo("booksportal.com");
libraryKiosk.connectTo("google.com");

Explanation

In this challenge, you had to implement the proxy pattern, such that, it restricted the use of the kiosk to access apps/websites for the students. As mentioned in the problem statement, a student can access/connect to any app/site using the LibraryKiosk class.

class LibraryKiosk{
    open(app){
        console.log(`Opening ${app}`)
    }    
    connectTo(website) 
    { 
        console.log("Connecting to "+ website); 
    } 
}

To restrict the use, we introduce the ProxyLibraryKiosk class.

class ProxyLibraryKiosk{
 constructor(){
   this.libraryKiosk = new LibraryKiosk() 
   this.blockedSites = ["fb.com", "instagram.com","snapchat.com","google.com", "gmail.com"]
   this.blockedApps = ["camera", "photos", "music", "settings"] 
   }
  //code....
}

The constructor of the proxy class initializes a libraryKiosk instance and two additional variables: blockedSites and blockedApps. Both variables store the list of apps and websites that the students don’t have access to.

Next, we redefine the open function:

open(app){
  if(this.blockedApps.includes(app)){
     console.log(`You can't access the ${app}`)
   }else{
      this.libraryKiosk.open(app)
   }
}

We first check if the app that the student is trying to access is in the blockedApps list. If so, we display the “can’t access” message; else, we call the libraryKiosk.open function for the app.

Similarly, we redefine the connectTo function:

connectTo(website){
  if(this.blockedSites.includes(website)){
     console.log(`Access to ${website} denied`)
  }else{
    this.libraryKiosk.connectTo(website)
   }
}

We first check if the website that the student is trying to connect to is in the blockedSites list. If so, we display the “access denied” message; else, we call the libraryKiosk.connect function for the website.

Now when a student calls the open/connectTo function on an app/website from the blocked list, the access will be denied. Another benefit of using the proxy pattern is that it reduces the number of direct requests that are sent to the target. It filters out and only sends valid requests forward, thus reducing the load.


Now that you have learned about the structural patterns let’s discuss behavioral patterns in the next lesson.