public class Employee {
private String name;
private String position;
private double salary;
public Employee(String name, String position, double salary) {
this.name = name;
this.position = position;
this.salary = salary;
}
public double calculatePay() {
// Логика расчета зарплаты
return salary * 0.9; // пример расчета с учетом налогов
}
public void saveToDatabase() {
// Логика сохранения данных сотрудника в базу данных
System.out.println("Saving " + name + " to the database");
}
public String generateReport() {
// Логика генерации отчета о сотруднике
return "Report for " + name + ": Position - " + position + ", Salary - " + salary;
}
}
public class Employee {
private String name;
private String position;
private double salary;
public Employee(String name, String position, double salary) {
this.name = name;
this.position = position;
this.salary = salary;
}
public String getName() {
return name;
}
public String getPosition() {
return position;
}
public double getSalary() {
return salary;
}
}
public class Payroll {
public double calculatePay(Employee employee) {
return employee.getSalary() * 0.9;
}
}
public class EmployeeRepository {
public void saveToDatabase(Employee employee) {
System.out.println("Saving " + employee.getName() + " to the database");
}
}
public class ReportGenerator {
public String generateReport(Employee employee) {
return "Report for " + employee.getName() + ": Position - " + employee.getPosition() + ", Salary - " + employee.getSalary();
}
}
// Базовый класс для расчета зарплаты сотрудников
public abstract class Employee {
public abstract double calculateSalary();
}
// Класс для штатных сотрудников
public class FullTimeEmployee extends Employee {
private double baseSalary;
public FullTimeEmployee(double baseSalary) {
this.baseSalary = baseSalary;
}
@Override
public double calculateSalary() {
return baseSalary;
}
}
// Класс для контрактных сотрудников
public class ContractEmployee extends Employee {
private double hourlyRate;
private int hoursWorked;
public ContractEmployee(double hourlyRate, int hoursWorked) {
this.hourlyRate = hourlyRate;
this.hoursWorked = hoursWorked;
}
@Override
public double calculateSalary() {
return hourlyRate * hoursWorked;
}
}
// Класс для расчета общей зарплаты всех сотрудников
public class SalaryCalculator {
public double calculateTotalSalary(Employee[] employees) {
double totalSalary = 0;
for (Employee employee : employees) {
totalSalary += employee.calculateSalary();
}
return totalSalary;
}
}
public class Rectangle {
private int width;
private int height;
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getArea() {
return width * height;
}
}
public class Square extends Rectangle {
@Override
public void setWidth(int width) {
super.setWidth(width);
super.setHeight(width); // Нарушение принципа LSP
}
@Override
public void setHeight(int height) {
super.setHeight(height);
super.setWidth(height); // Нарушение принципа LSP
}
}
public class Rectangle {
private int width;
private int height;
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getArea() {
return width * height;
}
}
public class Square {
private Rectangle rectangle;
public Square(int side) {
this.rectangle = new Rectangle();
this.rectangle.setWidth(side);
this.rectangle.setHeight(side);
}
public int getSide() {
return rectangle.getWidth();
}
public void setSide(int side) {
rectangle.setWidth(side);
rectangle.setHeight(side);
}
public int getArea() {
return rectangle.getArea();
}
}
public interface Worker {
void work();
void eat();
}
public class HumanWorker implements Worker {
@Override
public void work() {
System.out.println("Human working");
}
@Override
public void eat() {
System.out.println("Human eating");
}
}
public class RobotWorker implements Worker {
@Override
public void work() {
System.out.println("Robot working");
}
@Override
public void eat() {
// Нарушение принципа ISP: Робот не ест, но вынужден реализовывать этот метод
throw new UnsupportedOperationException("Robots do not eat");
}
}
В этом примере интерфейс Worker содержит методы work и eat. Класс RobotWorker вынужден реализовывать метод eat, который ему не нужен, что нарушает принцип ISP. Чтобы исправить это и следовать принципу ISP, необходимо разделить интерфейс Worker на более мелкие, специфичные интерфейсы. В коде ниже класс RobotWorker реализует только нужный ему интерфейс Workable, и не вынужден реализовывать не нужный ему метод eat.
public interface Workable {
void work();
}
public interface Eatable {
void eat();
}
public class HumanWorker implements Workable, Eatable {
@Override
public void work() {
System.out.println("Human working");
}
@Override
public void eat() {
System.out.println("Human eating");
}
}
public class RobotWorker implements Workable {
@Override
public void work() {
System.out.println("Robot working");
}
}
Пример класса на Java, нарушающего принцип DIP:
public class PasswordReminder {
private MySQLConnection dbConnection;
public PasswordReminder() {
this.dbConnection = new MySQLConnection();
}
// Другие методы, использующие dbConnection
}
Чтобы исправить это, нужно использовать интерфейс для абстрагирования зависимости. Класс PasswordReminder зависит от абстракции DatabaseConnection, а не от конкретной реализации MySQLConnection. Это позволяет легко менять реализацию базы данных без изменения самого класса PasswordReminder
public interface DatabaseConnection {
void connect();
// Другие методы для работы с базой данных
}
public class MySQLConnection implements DatabaseConnection {
@Override
public void connect() {
// Реализация подключения к MySQL
}
}
public class PasswordReminder {
private DatabaseConnection dbConnection;
public PasswordReminder(DatabaseConnection dbConnection) {
this.dbConnection = dbConnection;
}
// Другие методы, использующие dbConnection
}