Skip to content

Instantly share code, notes, and snippets.

@ArisAgnew
Created June 20, 2021 19:58
Show Gist options
  • Save ArisAgnew/30c9e7d7bdb8d272cc70c632539e5ed4 to your computer and use it in GitHub Desktop.
Save ArisAgnew/30c9e7d7bdb8d272cc70c632539e5ed4 to your computer and use it in GitHub Desktop.
Refactoring If-Else to State Design Pattern
//If-Else Approach
public enum Reaction
{
Initial = 1,
Liked = 2,
Disliked = 3
}
public class LikeDislikeComponent
{
public Reaction Current { get; private set; } = Reaction.Initial;
public int Likes { get; private set; }
public int Dislikes { get; private set; }
public void Like()
{
if (Current == Reaction.Initial)
{
Likes++;
Current = Reaction.Liked;
}
else if (Current == Reaction.Liked)
{
Likes--;
Current = Reaction.Initial;
}
else if (Current == Reaction.Disliked)
{
Dislikes--;
Likes++;
Current = Reaction.Liked;
}
}
public void Dislike()
{
if (Current == Reaction.Initial)
{
Dislikes++;
Current = Reaction.Disliked;
}
else if (Current == Reaction.Liked)
{
Likes--;
Dislikes++;
Current = Reaction.Disliked;
}
else if (Current == Reaction.Disliked)
{
Dislikes--;
Current = Reaction.Initial;
}
}
}
//State Design Pattern
namespace LikesDislikes
{
using System;
public class LikeDislikeComponent
{
//constructors
public LikeDislikeComponent(ILikeDislikeComponentState state)
{
_currentState = state;
}
public LikeDislikeComponent(
int likesCount,
int dislikesCount,
ILikeDislikeComponentState state) : this (state)
{
LikesCount = likesCount;
DislikesCount = dislikesCount;
}
//private properties
private ILikeDislikeComponentState _currentState;
//public properties
public int LikesCount { get; set; }
public int DislikesCount { get; set; }
//methods
public void ChangeState(ILikeDislikeComponentState state) => _currentState = state;
public void Like() => _currentState.Like(this);
public void Dislike() => _currentState.Dislike(this);
}
public interface ILikeDislikeComponentState
{
void Like(LikeDislikeComponent component);
void Dislike(LikeDislikeComponent component);
}
public class InitialState : ILikeDislikeComponentState
{
public void Like(LikeDislikeComponent component)
{
component.LikesCount++;
component.ChangeState(new LikedState());
}
public void Dislike(LikeDislikeComponent component)
{
component.DislikesCount++;
component.ChangeState(new DislikedState());
}
}
public class LikedState : ILikeDislikeComponentState
{
public void Like(LikeDislikeComponent component)
{
component.LikesCount--;
component.ChangeState(new InitialState());
}
public void Dislike(LikeDislikeComponent component)
{
component.LikesCount--;
component.DislikesCount++;
component.ChangeState(new DislikedState());
}
}
public class DislikedState : ILikeDislikeComponentState
{
public void Like(LikeDislikeComponent component)
{
component.DislikesCount--;
component.LikesCount++;
component.ChangeState(new LikedState());
}
public void Dislike(LikeDislikeComponent component)
{
component.DislikesCount--;
component.ChangeState(new InitialState());
}
}
class Program
{
static void Main()
{
var component = new LikeDislikeComponent(34, 5, new InitialState());
component.Like(); //Likes: 35, Dislikes 5
component.Like(); //Likes: 34, Dislikes 5
component.Dislike(); //Likes: 34, Dislikes 6
component.Dislike(); //Likes: 34, Dislikes 5
component.Like(); //Likes: 35, Dislikes 5
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment