抽象类继承接口

一、抽象类继承接口可以不用完全实现接口中的方法或者不实现接口方法。

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();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值