通常我们会遇到这样的问题,假如某两个互不相关的类:
class A
{
public a()
{
System.out.println("计算打字速度!");
}
}
class B
{
public b()
{
System.out.println("放音乐!");
}
}
问题是这样的:在调用A类的方法a()时,同时必须调用B类的b()方法,在不改变源代码的情况下,你该怎么实现?
其实要解决这种问题方法很多,我们在实际情况也经常会遇到,我的方法就是利用适配器模式来解决!
第一种方法:
定义一个新的类SubA继承A,我们调用的时候直接调用A类的子类(即SubA),代码如下:
class A
{
public a()
{
System.out.println("计算打字速度!");
}
}
class B
{
public b()
{
System.out.println("放音乐!");
}
}
class SubA extends A
{
//在这里重写A类的a方法
public a()
{
//先调用父方法
super.a();
//new一个B的实例
B b=new B();
//调用b的b()方法,这样就新增了一个"放音乐"的新方法啦!
b.b();
}
}
/*
*测试类
*/
public class Test
{
public static void main(String args[])
{
SubA a=new SubA();
//这里调用的时候同时调用了B类的b方法,即可解决问题。
a.a();
}
}
不知道大家有没有发现,如果我们客户需求有变更,还需要加一个功能---"加入表情",那我们即不是又需要改SubA类a方法的代码?不是说不准改代码吗?那我们该怎么办呢?头痛。。。。幸好。。。。。。Java中还有接口呢?我们可以利用接口来实现这样的功能。
第二种方法:
我们把所要加的功能抽象出来放到接口里。就像这样
interface Manager
{
public abstract void extendFun();
}
extendFun()方法其实放的就是客户所需求的"功能的定义";接口必须要实现它,所以定义如下类
class A
{
public a()
{
System.out.println("计算打字速度!");
}
}
//功能接口
interface Manager
{
public abstract void extendFun();
}
//类B实现了Manager接口
class B implements Manager
{
//原始方法都不要,直接实现接口里的extendFun()方法
// public b()
// {
// System.out.println("放音乐!");
// }
public void extendFun()
{
System.out.println("放音乐!");
}
}
//类C实现了Manager接口
class C implements Manager
{
// public c()
// {
// System.out.println("加入了表情!");
// }
public void extendFun()
{
System.out.println("加入了表情!");
}
}
class SubA extends A
{
//声明一个Manager接口属性
private Manager manager;
//这里定义一个构造函数,传入接口,只要是实现了Manager接口的类都
//可以通过构造方法传入进来,你也可以通过Spring来注入具体实现类
public SubA(Manager manager)
{
this.manager=manager;
}
//覆盖父类的方法
public a()
{
super.a();
//调用接口的extendFun();方法,其实调用的就是实现接口的类的
//extendFun()方法。至此就给A类加入了新的功能了。
manager.extendFun();
}
}
public class Test
{
public static void main(String args[])
{
B b=new B();
//通过构造函数传入接口实现Manager接口的实现类
SubA a=new SubA(b);
a.a();//调用a方法
}
}
不知道大家有没有弄明白,因为个人水平有限,语言表达不是很顺。还请各位见谅!!!!!!!