java中通过Adapter实现拉帘子功能

107 阅读2分钟

问题引入

不知道各位有没有遇到过这样一种情况:要实现一种接口(implements)但是接口很多方法自己并不需要使用。一种暴力简单的方法当然是直接删掉那些代码,但是如果需要实现很多次这个接口,难道每次都要删掉吗?而且万一有需要实现你删掉代码的一个方法,再次寻找又是一种麻烦。

解决办法

有一种比较优雅的方法,就是创建一个抽象类(abstract),命名为Adaper,然后继承那个需要实现的接口,再把想要实现的方法注释掉(这一步是为了让这个抽象类缺少这些方法,之后你就可以只面对你需要的方法了)。 接着在你写的实例类里继承这个Adapter抽象类,这下你就可以只看到你想看到的了。 用我正在学习的swing布局器代码举个例子:

import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.LayoutManager2;

public abstract class LayOutAdapter implements LayoutManager2{

	@Override
	public void addLayoutComponent(String name, Component comp) {
		// TODO Auto-generated method stub
		
	}

//	@Override
//	public void removeLayoutComponent(Component comp) {
//		// TODO Auto-generated method stub
//		
//	}

	@Override
	public Dimension preferredLayoutSize(Container parent) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Dimension minimumLayoutSize(Container parent) {
		// TODO Auto-generated method stub
		return null;
	}

//	@Override
//	public void layoutContainer(Container parent) {
//		// TODO Auto-generated method stub
//		
//	}

//	@Override
//	public void addLayoutComponent(Component comp, Object constraints) {
//		// TODO Auto-generated method stub
//		
//	}

	@Override
	public Dimension maximumLayoutSize(Container target) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public float getLayoutAlignmentX(Container target) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public float getLayoutAlignmentY(Container target) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public void invalidateLayout(Container target) {
		// TODO Auto-generated method stub
		
	}
}

然后在我的实例类里就会看到这样:

import java.awt.Container;
import java.awt.Dimension;
import java.awt.LayoutManager2;

public class SimpleLayOut extends LayOutAdapter {

	@Override
	public void addLayoutComponent(Component comp, Object constraints) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void removeLayoutComponent(Component comp) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void layoutContainer(Container parent) {
		// TODO Auto-generated method stub
		
	}

	
}

的确干净清爽了很多,优雅!

总结

为什么标题中说是拉帘子功能呢?因为我觉得这样子把一些不必要的代码隐藏掉很像是拉帘子把它遮掉,但不是直接有铲子铲掉,因为它还是存在着,像看到想调用的时候很方便,这种说法很形象。