Description
Decouple an abstraction from its implementation so that the two can vary independently.
- Select or switch implementations at runtime
- Replace the implementation by another one without having to modify the referencing class by using an interface
- It can also be thought of as two layers of abstraction
Exemple
- The client can change the *Logger classes by another without having to modify the UserService.
ILogger.cs
|
public interface ILogger
{
void WriteLine(string text);
}
|
ConsoleLogger
|
public class ConsoleLogger : ILogger
{
public void WriteLine(string text)
{
Console.WriteLine(text);
}
}
|
IUserService.cs
|
public interface IUserService
{
void ChangePassword(int userId, string newPassword);
}
|
UserService.cs
|
public class UserService : IUserService
{
private ILogger logger;
public UserService(ILogger logger)
{
this.logger = logger;
}
public void ChangePassword(int userId, string newPassword)
{
logger.WriteLine($"Password has been change for user {userId}.");
}
}
|
|
IUserService userService = new UserService(new ConsoleLogger());
userService.ChangePassword(1, "0000");
|