1.适配器的使用
如果定义了一个接口,则它的子类要实现他全部的抽象方法。但是我们可以通过适配器来实现。这里用到了一个abstract来实现。
interface Window{
public void open();
public void close();
public void icon();
public void unicon();
}
class MyWindow implements Window{
@Override
public void open() {
// TODO Auto-generated method stub
}
@Override
public void close() {
// TODO Auto-generated method stub
}
@Override
public void icon() {
// TODO Auto-generated method stub
}
@Override
public void unicon() {
// TODO Auto-generated method stub
}
}
public class AdpaterDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
像以上的实现要覆写全部的抽象方法,但是现在希望可以根据自己的需要来选择性的覆写,这个时候我们就要借助一个中间变量来实现,这个中间的变量就是抽象类。用一个抽象类先将接口实现了,但是实现的话都属于空实现,之后再继承此类。
因为抽象类的方法也不能直接使用,必须覆写。
interface Window{
public void open();
public void close();
public void icon();
public void unicon();
}
abstract class WindowAdpater implements Window{
public void open(){}
public void close(){}
public void icon(){}
public void unicon(){}
};
class MyWindow extends WindowAdpater{
public void open(){
System.out.println("打开窗口");
}
}
public class AdpaterDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Window win = new MyWindow();
win.open();
}
}
2.工厂设计模式
看下面这段代码:
interface HomeWork{
public void write();
}
class math implements HomeWork{
public void write(){
System.out.println("写数学作业。");
}
};
class English implements HomeWork{
public void write(){
System.out.println("写英语作业。");
}
};
public class InterDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
HomeWork hm1 = new math();
hm1.write();
HomeWork hm2 = new English();
hm2.write();
}
}
他设计的并不好,因为他需要对main()函数中做大的修改,在这里我们应该把主方法看做一个客户端。客户端的代码要越简单越好。这样的设计不好耦合性太高了
所以现在我们将对他做如下的修改:
interface HomeWork{
public void write();
}
class math implements HomeWork{
public void write(){
System.out.println("写数学作业。");
}
};
class English implements HomeWork{
public void write(){
System.out.println("写英语作业。");
}
};
class Factory {
public static HomeWork getFruit(String className){
HomeWork hm =null;
if("math".equals(className)){
hm = new math();
}
if("English".equals(className)){
hm = new English();
}
return hm;
}
};
public class InterDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
HomeWork hm = Factory.getFruit(args[0]);
if(hm!=null){
hm.write();
}
}
}
3.抽象类和接口的区别
No | 比较点 | 抽象类 | 接口 | |
1 | 组成 | 抽象方法,普通方法,常量,变量,构造方法,全局常量 | 抽象方法,全局常量 | |
2 | 定义 | Abstract | interface | |
3 | 子类 | 子类通过extends继承抽象类 | 子类通过implements实现接口 | |
4 | 限制 | 一个子类只能继承一个抽象方法 | 一个子类可以同时实现多个接口 | |
5 |
关系 | 一个抽象类可以实现多个接口 | 一个接口不能继承一个抽象类,可以实现多个接口 | |
一个抽象类中允许包含一个接口 | 一个接口允许包含一个抽象类 | |||
6 | 设计模式 | 模板设计 | 工厂设计、代理设计 | |
都是通过对象的多态性,都是通过子类进行实例化实现操作 | ||||
7 | 实现限制 | 存在单继承限制 | 不存在此种限制 |
从以上可以看出,两者做选择是优先选择接口