```java
public interface Shape {
default double calculatePerimeter() {
return 0.0;
}
default double calculateArea() {
return 0.0;
}
String getFillColor();
String getBorderColor();
}
public class Circle implements Shape {
private double radius;
private String fillColor;
private String borderColor;
public Circle(double radius, String fillColor, String borderColor) {
this.radius = radius;
this.fillColor = fillColor;
this.borderColor = borderColor;
}
@Override
public double calculatePerimeter() {
return 2 * Math.PI * radius;
}
@Override
public double calculateArea() {
return Math.PI * radius * radius;
}
@Override
public String getFillColor() {
return fillColor;
}
@Override
public String getBorderColor() {
return borderColor;
}
}
public class Rectangle implements Shape {
private double width;
private double height;
private String fillColor;
private String borderColor;
public Rectangle(double width, double height, String fillColor, String borderColor) {
this.width = width;
this.height = height;
this.fillColor = fillColor;
this.borderColor = borderColor;
}
@Override
public double calculatePerimeter() {
return 2 * (width + height);
}
@Override
public double calculateArea() {
return width * height;
}
@Override
public String getFillColor() {
return fillColor;
}
@Override
public String getBorderColor() {
return borderColor;
}
}
public class Triangle implements Shape {
private double side1;
private double side2;
private double side3;
private String fillColor;
private String borderColor;
public Triangle(double side1, double side2, double side3, String fillColor, String borderColor) {
this.side1 = side1;
this.side2 = side2;
this.side3 = side3;
this.fillColor = fillColor;
this.borderColor = borderColor;
}
@Override
public double calculatePerimeter() {
return side1 + side2 + side3;
}
@Override
public double calculateArea() {
double s = calculatePerimeter() / 2;
return Math.sqrt(s * (s - side1) * (s - side2) * (s - side3));
}
@Override
public String getFillColor() {
return fillColor;
}
@Override
public String getBorderColor() {
return borderColor;
}
}
public class Main {
public static void main(String[] args) {
Circle circle = new Circle(5, "red", "black");
Rectangle rectangle = new Rectangle(4, 5, "blue", "green");
Triangle triangle = new Triangle(3, 4, 5, "yellow", "purple");
System.out.println("Circle:");
System.out.println("Perimeter: " + circle.calculatePerimeter());
System.out.println("Area: " + circle.calculateArea());
System.out.println("Fill color: " + circle.getFillColor());
System.out.println("Border color: " + circle.getBorderColor());
System.out.println("\nRectangle:");
System.out.println("Perimeter: " + rectangle.calculatePerimeter());
System.out.println("Area: " + rectangle.calculateArea());
System.out.println("Fill color: " + rectangle.getFillColor());
System.out.println("Border color: " + rectangle.getBorderColor());
System.out.println("\nTriangle:");
System.out.println("Perimeter: " + triangle.calculatePerimeter());
System.out.println("Area: " + triangle.calculateArea());
System.out.println("Fill color: " + triangle.getFillColor());
System.out.println("Border color: " + triangle.getBorderColor());
}
}
```
Этот код определяет интерфейс `Shape`, который содержит методы для расчета периметра и площади фигуры, а также цвет заливки и границы. Затем классы `Circle`, `Rectangle` и `Triangle` реализуют этот интерфейс, предоставляя свои конкретные реализации методов и храня информацию о соответствующих параметрах фигур. В методе `main` создаются экземпляры каждой фигуры, выводятся их характеристики (периметр, площадь, цвет заливки и цвет границы) в консоль.