欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

双向适配器和instanceof的用法

程序员文章站 2022-05-25 13:56:15
...

假设有两个接口,又有同名函数,又有不同名的函数。做一个双向适配器:

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

}

运行结果:

双向适配器和instanceof的用法

最终的目的,同一个双向适配器,可以传入两种不同的被适配者。调用适配器,每次只触发一个函数。

传入A, 只触发A的函数。传入B,只触发B的函数。

老师教例题。也必须要做例题的改进,项目的制作。课本作者,也推出了一些拓展教程。技术就是这样一点一滴硬刚出来的。

十个人,一起应聘找工作。十个人,只会课本原题,这是职业的竞争力吗? 没有项目,没有说服力。会了原题、答对原题,一个人也就止步于此、固步自封,很难去解决实际问题,更没有创新。为什么很多大作,都是非专业出身、非科班出身的人做的。