一、抽象类继承接口可以不用完全实现接口中的方法或者不实现接口方法。
1、有利的地方:由于不用完全实现接口,可以实现我们需要的方法,这样就不用全部实现。
2、例子:装饰者模式来解释
(1)、首先创建一个Shape接口
package com.pattern.decoratorPattern;
// 创建一个接口
public interface Shape {
void draw();
}
(2)、创建实现接口的实体类:Square
package com.pattern.decoratorPattern;
// 创建实现接口的实体类
public class Square implements Shape {
@Override
public void draw() {
System.out.println(“画一个正方形”);
}
}
(3)、创建实现了 Shape 接口的抽象装饰类:ShapeDecorator
package com.pattern.decoratorPattern;
//创建实现了 Shape 接口的抽象装饰类
public abstract class ShapeDecorator implements Shape {
protected Shape decoratorShape;
public ShapeDecorator(Shape decoratorShape) {
this.decoratorShape = decoratorShape;
}
@Override
public void draw() { // 注意由于有了abstract,这个draw方法可以不用写,也就是不用实现Shap的方法
// 或者实现我们需要的方法
decoratorShape.draw();
}
}
(4)、创建一个RedShapeDecorator 继承 ShapeDecorator 来新增功能。
package com.pattern.decoratorPattern;
public class RedShapeDecorator extends ShapeDecorator {
// 用于装饰其他功能,就是新增其他功能,而不改原来的代码
public RedShapeDecorator(Shape decoratorShape) {
super(decoratorShape);
}
@Override
// decoratorShape 相当于 RedShapeDecorator(new Square()) 中的new Square
若把 decoratorShape.draw(); 注释掉则不会调用Square中的draw方法,也就无 “画一个正方形” 这个功能
public void draw() {
decoratorShape.draw();
setRedBorder(decoratorShape);
}
private void setRedBorder(Shape decoratorShape){
System.out.println(“红色的边界”);
}
}
(5)、测试
package com.pattern.decoratorPattern;
public class DecoratorPatternDemo {
public static void main(String[] args) {
Shape square= new Square();
ShapeDecorator redSquare = new RedShapeDecorator(new Square());
// 原来的正方形
System.out.println("普通边界:");
square.draw();
// 新增了红色边界的正方形
System.out.println("\n红的边界的正方形:");
redSquare .draw();
}
}
额外提醒:上述代码的步骤(3)可以去掉,直接用步骤(4)去继承Shape接口。(1)(2)不变。
改后代码如下:
(1)、首先创建一个Shape接口
package com.pattern.decoratorPattern;
// 创建一个接口
public interface Shape {
void draw();
}
(2)、创建实现接口的实体类:Square
package com.pattern.decoratorPattern;
// 创建实现接口的实体类
public class Square implements Shape {
@Override
public void draw() {
System.out.println(“画一个正方形”);
}
}
(3)、修改后的代码
package com.pattern.decoratorPattern;
public class RedShapeDecorator implements Shape { // 直接实现Shape接口
// 用于装饰其他功能,就是新增其他功能,而不改原来的代码
private Shape decoratorShape;
public RedShapeDecorator(Shape decoratorShape) {
this.decoratorShape = decoratorShape;
}
@Override
// decoratorShape 相当于 RedShapeDecorator(new Circle()) 中的new Circle
// 若把 decoratorShape.draw(); 注释掉则不会调用Square中的draw方法,也就无 "画一个正方形" 这个功能
public void draw() {
decoratorShape.draw();
setRedBorder(decoratorShape);
}
private void setRedBorder(Shape decoratorShape){
System.out.println("红色的边界");
}
}
步骤(3)的代码直接改成实现Shape接口好处就是 省略掉原来步骤ShapeDecorator 类代码,坏处就是
现在步骤(3)的代码要把Shape里接口的方法全部实现,不管你是否有用到Shape里的方法。
(4)、测试
package com.pattern.decoratorPattern;
public class DecoratorPatternDemo {
public static void main(String[] args) {
Shape circle = new Square();
RedShapeDecorator redSquare = new RedShapeDecorator(new Square());
System.out.println("普通边界:");
square.draw();
System.out.println("\n红的边界正方形:");
redSquare .draw();
}
}