Skip to main content

Strategy Design Pattern


For example, I have a program with an Animal abstract class and two sub-classes Dog and Bird. I want to add new behavior for the class Animal, this is "fly".  Now, I face two approaches to solve this issue:

1. Adding an abstract method "fly" into the class Animal. Then, I force the sub-classes should be implemented this method, something like:

public abstract class Animal{
 //bla bla
 public abstract void fly();
}

public class Bird extends Animal{
 //bla bla
 public void fly(){
 System.out.println("Fly high");
 }
}

public class Dog extends Animal{
 //bla bla
 public void fly(){
  System.out.println("Cant fly");
 }
}

2. Creating an interface with method "fly" inside. The same issue to an abstract class, I force the classes these implement this interface should have a method "fly" inside:

public interface Flyable{
 public void fly();
}
public class Bird implements Flyable{
//bla bla
 public void fly(){
  System.out.println("Fly high");
 }
}

public class Dog implements Flyable{
//bla bla
 public void fly(){
  System.out.println("Cant fly");
 }
}

These approaches are the OOP basics in order to solve the problem when we want to add a new behavior, but there is a disadvantage because all sub-classes are forced to implement this behavior even it doesn't make sense for some classes. And, there is no reused code by using interfaces only.

That is where Strategy Design Pattern can help. The following is an example code:

public interface Flyable{
 public void fly();
}

public class ItFlys implements Flyable{
  public void fly(){
   System.out.println("Fly high");
 }
}

public class CantFly implements Flyable{
  public void fly(){
   System.out.println("Cant fly");
 }
}

public abstract class Animal{
 //bla bla
 Flyable flyType;

 public void tryToFly(){
  flyType.fly();
 }
 public void setFlyAbility(Flyable newFlyType){
  flyType = newFlyType;
 }
}

public class Bird extends Animal{
 //bla bla
 public Bird(){
   flyType = new ItFlys ();
 }
}

public class Dog extends Animal{
 //bla bla
 public Dog (){
   flyType = new CantFly ();
 }
}

This is a diagram that shows the example above:
src: https://www.youtube.com/watch?v=-NCgRD9-C6o&index=3&list=PLF206E906175C7E07

References:

Comments

Popular posts from this blog

Git Feature Branch Workflow

Motivator It's important for a team to have an agreement on how the changes of source code should be applied. According to projects and teams size, we will define a workflow or select one from recommended workflows ; the "Feature Branch Workflow" is a candidate. What is it? - One branch "master" for main codebase - Several separated branches for features development Why should we care? - Be super simple and allow each developer works on a particular feature. - A stable codebase (master) benefits for continuous integration (CI) environment - Leverage "Pull request" for Code review How it works? A lifecyle of a feature branch (usually created by a story) 1. Creator creates a new branch from a story.  For example: "ABC-1-setup-projects" 2. Creator checkouts the created branch and works on the branch (commits, pushes) 3. Creator has done the feature, he uses "pull request" to merge his branch into branch "master...

Monday vhandit #2

  Introduction to OpenLDAP directory service "A directory is a specialized database specially designed for searching and browsing, in addition to supporting basic lookup and update functions" A directory service can be local, providing a restricted context; or global, providing service to a much broader context. Curlie is a good example of a directory service. LDAP (Lightweight Directory Access Protocol) is a protocol for accessing directory services , specifically X.500-based directory services. OpenLDAP is an open-source implementation of LDAP. Writing system software: code comments I have read Clean Code (by Uncle Bob) and I thought that I should void comments since the code it explains its implementation itself. That is right but not always true. In this post, the author categorized the comments into 9 types. Only "trivial comments" and "backup comments" are the ones that should be avoided. I myself agree with "writing good comments is harder tha...

Regex - Check a text without special characters but German, French

Special characters such as square brackets ([ ]) can cause an exception " java.util.regex.PatternSyntaxException " or something like this if we don't handle them correctly. I had met this issue. In my case, my customers want our application should allow some characters in German and French even not allow some special characters. The solution is that we limit the allowed characters by showing the validation message on GUI. For an instance, the message looks like the following: "This field can't contain any special characters; only letters, numbers, underscores (_), spaces and single quotes (') are allowed." I used Regular Expression to check it. For entering Germany and French, I actually don't have this type of keyboard, so I referred these sites: * German characters: http://german.typeit.org/ * French characters: http://french.typeit.org/ Here is my code: package vn.nvanhuong.practice; import java.util.regex.Matcher; import java.util...

Building Axon.ivy Projects on Bitbucket Pipelines

Read me  if you don't know what Axon.ivy (Ivy) is. Motivation -  Ivy projects are designed to be built on a continuous integration (CI) server like Jenkins - Today, Bitbucket supports for CI with Bitbucket Pipelines - We're using Bitbucket. Then, why not? It must be very cool and convenient for us if we can centralize our CI and VCS (version control system) tools in one place. Here is an approach We have to use a maven plugin called project-build-plugin  to build ivy projects. This plugin requires an instance of Ivy engine during building time. Bitbucket Pipelines allows us to specify our own docker image as a build environment. What we need to do  is to prepare our docker image with needed stuffs such as JDK, Maven, Ivy engine, etc. Step 1. Prepare Docker images For testing purpose, I already created two docker images: Maven and Axon.ivy engine. They are now available on Docker Hub This image for Maven using Oracle JDK 8 This image for Axon.iv...