Java本身不支持多继承,但是在有些场合下,我们却希望一个类能够有多继承的能力,比如使用Facade模式时,Facade类如果能够“多继承”,则Facade类可以简化许多。
配合内部类可以“模拟”多继承,基本的思路是,尽管内部类是单继承的,但是由于可以在外部类中定义多个内部类,这样外部类就可以通过简单的封装内部类的方法间接的实现了多继承。
比如“多功能打印机”,即有打印功能,也有复印功能。首先分别定义打印和复印接口:
/**
* 打印机接口
* @author subaochen
*
*/
public interface Printer {
public void print();
}
/**
* 复印机接口
* @author subaochen
*
*/
public interface Copier {
public void copy();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 打印机接口
* @author subaochen
*
*/
publicinterfacePrinter{
publicvoidprint();
}
/**
* 复印机接口
* @author subaochen
*
*/
publicinterfaceCopier{
publicvoidcopy();
}
然后可以如下定义SmartPrinter:
/**
* 智能打印机
* @author subaochen
*
*/
public class SmartPrinter {
public void print(){
new MultiPrinter().print();
}
public void copy(){
new MultiCopier().copy();
}
class MultiPrinter implements Printer{
@Override
public void print() {
System.out.println("multiPrinter print");
}
}
class MultiCopier implements Copier{
@Override
public void copy() {
System.out.println("multiCopier copy");
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* 智能打印机
* @author subaochen
*
*/
publicclassSmartPrinter{
publicvoidprint(){
newMultiPrinter().print();
}
publicvoidcopy(){
newMultiCopier().copy();
}
classMultiPrinterimplementsPrinter{
@Override
publicvoidprint(){
System.out.println("multiPrinter print");
}
}
classMultiCopierimplementsCopier{
@Override
publicvoidcopy(){
System.out.println("multiCopier copy");
}
}
}
SmartPrinter的测试客户端如下:
/**
* SmartPrinter的测试客户端
* @author subaochen
*
*/
public class SmartPrinterTest {
public static void main(String[] args){
SmartPrinter sp = new SmartPrinter();
sp.print();
sp.copy();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
/**
* SmartPrinter的测试客户端
* @author subaochen
*
*/
publicclassSmartPrinterTest{
publicstaticvoidmain(String[]args){
SmartPrintersp=newSmartPrinter();
sp.print();
sp.copy();
}
}
可以看出,在SmartPrinterTest中,我们只是使用SmartPrinter对象即可同时获得print和copy两个功能,即SmartPrinter类其实是一个Facade类。
当然,代码还可以进一步优化,比如SmartPrinter可以实现其中的一个接口,使得代码显得稍微紧凑一点:
/**
* 智能打印机
* @author subaochen
*
*/
public class SmartPrinter implements Printer{
public void print(){
System.out.println("SmartPrinter print");
}
public void copy(){
new MultiCopier().copy();
}
class MultiCopier implements Copier{
@Override
public void copy() {
System.out.println("multiCopier copy");
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
* 智能打印机
* @author subaochen
*
*/
publicclassSmartPrinterimplementsPrinter{
publicvoidprint(){
System.out.println("SmartPrinter print");
}
publicvoidcopy(){
newMultiCopier().copy();
}
classMultiCopierimplementsCopier{
@Override
publicvoidcopy(){
System.out.println("multiCopier copy");
}
}
}
打印机和复印机也可以是抽象类:
/**
* 打印机基类
* @author subaochen
*
*/
public abstract class Printer {
public void print(){
System.out.println("abstract print");
}
}
/**
* 复印机基类
* @author subaochen
*
*/
public abstract class Copier {
public void copy(){
System.out.println("abstract copy");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* 打印机基类
* @author subaochen
*
*/
publicabstractclassPrinter{
publicvoidprint(){
System.out.println("abstract print");
}
}
/**
* 复印机基类
* @author subaochen
*
*/
publicabstractclassCopier{
publicvoidcopy(){
System.out.println("abstract copy");
}
}
这样SmartPrinter就变成了:
public class SmartPrinter extends Printer{
@Override
public void print(){
super.print();
System.out.println("SmartPrinter print");
}
public void copy(){
new MultiCopier().copy();
}
class MultiCopier extends Copier{
@Override
public void copy() {
super.copy();
System.out.println("SmartPrinter copy");
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
publicclassSmartPrinterextendsPrinter{
@Override
publicvoidprint(){
super.print();
System.out.println("SmartPrinter print");
}
publicvoidcopy(){
newMultiCopier().copy();
}
classMultiCopierextendsCopier{
@Override
publicvoidcopy(){
super.copy();
System.out.println("SmartPrinter copy");
}
}
}
0