双向适配器和instanceof的用法
假设有两个接口,又有同名函数,又有不同名的函数。做一个双向适配器:
public interface ThreeElectric {
public void connect();
public void f2();
public void f3();
public void f4_three();
}
public interface TwoElectric {
public void connect();
public void f2();
public void f3();
public void f4_two();
}
各自的实现类:
public class Wash implements ThreeElectric {
String name;
public Wash( ) {
name="黄河--Three的实现类";
}
@Override
public void connect() {
System.out.println(name+ " Three接通");
}
public void f2() { }
public void f3() { }
@Override
public void f4_three() {
System.out.println(" ThreeElectric接口 f4_three");
}
}public class TV implements TwoElectric {
String name;
public TV( ) {
name="长江--Two的实现类";
}
@Override
public void connect() {
System.out.println(name+ " Two接通");
}
public void f2() { }
public void f3() { }
@Override
public void f4_two() {
System.out.println(" TwoElectric接口 f4_two");
}
}
双向适配器代码:
// 双向适配器
public class AdapterDouble implements ThreeElectric,TwoElectric {
TwoElectric twoElectric;
ThreeElectric threeElectric;
public AdapterDouble(ThreeElectric threeElectric,
TwoElectric twoElectric) {
this.threeElectric = threeElectric;
this.twoElectric = twoElectric;
}
@Override
public void connect() {
if( this instanceof ThreeElectric)
{
twoElectric.connect();
}
if( this instanceof TwoElectric)
{
threeElectric.connect();
}
}
@Override
public void f2() { twoElectric.f2(); }
public void f3() { twoElectric.f3();}
public void f4_three() { twoElectric.f4_two();}
public void f4_two() { threeElectric.f4_three(); }
}
其中的两次instanceof判断,条件永远成立,两个connect都会触发。参考运行结果:
public static void main(String[] args) {
System.out.println("8.2 adapter");
Wash wash=new Wash();
TV tv=new TV();
////
System.out.println("--------------");
AdapterDouble adapter=new AdapterDouble( wash,tv);
adapter.connect();
ThreeElectric t3=adapter;
adapter.connect();
TwoElectric t2=adapter;
adapter.connect();
}
结果:
8.2 adapter
--------------
长江--Two的实现类 Two接通
黄河--Three的实现类 Three接通
长江--Two的实现类 Two接通
黄河--Three的实现类 Three接通
长江--Two的实现类 Two接通
黄河--Three的实现类 Three接通
对于不同名的函数f4_three、f4_two, 可以指定转换为特定的某一个函数f4_two或者f4_three,这也符合适配器的目的,实现函数的转换。很多网友也是这么做的。
如果是一个永远成立的instanceof条件,判断、不判断,没必要。同名函数,能否只触发特定的某一个函数,而不是两个都触发?
这是一种实现办法:
// 双向适配器
public class AdapterDoubleGang implements ThreeElectric,TwoElectric {
Object adaptee;
public AdapterDoubleGang(Object adaptee) {
this.adaptee = adaptee;
}
@Override
public void connect() {
if( adaptee instanceof ThreeElectric)
{
((ThreeElectric)adaptee).connect();
}
if( adaptee instanceof TwoElectric)
{
((TwoElectric)adaptee).connect();
}
}
@Override
public void f2() { //参考connect的写法
}
public void f3() { //参考connect的写法
}
public void f4_three() { ((TwoElectric)adaptee).f4_two();}
@Override
public void f4_two() { ((ThreeElectric)adaptee).f4_three();
}
}
运行结果:
最终的目的,同一个双向适配器,可以传入两种不同的被适配者。调用适配器,每次只触发一个函数。
传入A, 只触发A的函数。传入B,只触发B的函数。
老师教例题。也必须要做例题的改进,项目的制作。课本作者,也推出了一些拓展教程。技术就是这样一点一滴硬刚出来的。
十个人,一起应聘找工作。十个人,只会课本原题,这是职业的竞争力吗? 没有项目,没有说服力。会了原题、答对原题,一个人也就止步于此、固步自封,很难去解决实际问题,更没有创新。为什么很多大作,都是非专业出身、非科班出身的人做的。
上一篇: 五子棋项目 --C语言