在MyWindow 类肯定要覆写全部方法,但是现在希望可以根据自己的需要选择性的覆盖某些方法。那么该怎么实现呢?
用一个类先将接口实现了,但是所有的实现都属于空实现。然后再继承这个类。应该使用抽象类,因为抽象类也不能直接使用。
适配器设计模式:只要接口和抽象类相互使用,就叫适配器模式。
1. interfaceWindow{
2. public void open() ; // 打开窗口
3. public void close() ; // 关闭窗口
4. public void icon() ; // 最小化
5. public void unicon() ; // 最大化
6. }
7. abstractclass WindowAdapter implements Window{
8. public void open(){}
9. public void close(){}
10. publicvoid icon(){}
11. publicvoid unicon(){}
12. };
13. class MyWindow extends WindowAdapter{
14. publicvoid open(){
15. System.out.println("打开窗口!") ;
16. }
17. };
18. public class AdpaterDemo{
19. publicstatic void main(String args[]){
20. Windowwin = new MyWindow() ;
21. win.open();
22. }
23. }
工厂设计模式:
所有接口的实例化对象都是通过工厂类取得的。那么客户端调用的时候根据传入的名称不同完成的功能也不同。
有如下一段代码
interface Fruit{
public void eat() ;
}
class Apple implementsFruit{
public void eat(){
System.out.println("吃苹果") ;
}
} ;
class Orange implements Fruit{
public void eat(){
System.out.println("吃橘子") ;
}
} ;
class Foctory{ //工厂类
public static FruitgetFruit(String className){
Fruit f = null ;
if("apple".equals(className)){
f =new Apple() ;
}
if("orange".equals(className)){
f =new Orange() ;
}
return f ;
}
} ;
public classInterDemo{
public static void main(Stringargs[]){
Fruit f =Foctory.getFruit(args[0]) ;
if(f!= null ){
f.eat();
}
}
}
if("apple".equals(className)){
f =new Apple() ;
}
这段代码是把apple写在前面,在以后的开发中,如果有字符串跟常量(这里是apple)比较,要永远把常量写在字符串的前面去。这样可以避免空指向异常。
代理设计模式:
刘某欠张某的钱,刘某有钱不还,所以张某找到讨债公司。讨债公司找刘某要钱。
要钱
张某---------------------》找到讨债公司-------------------》刘某
interface Give{
public void giveMoney() ;
}
class RealGiveimplements Give{
public void giveMoney(){
System.out.println("把钱还给我") ;
}
} ;
class ProxyGiveimplements Give{
private Give give = null ;
public ProxyGive(Give give){
this.give = give ;
}
public void before(){
System.out.println("刀子、枪支等。。。。。。。") ;
}
public void giveMoney(){
this.before() ;
this.give.giveMoney();
this.after() ;
}
public void after() {
System.out.println("销毁所有证据。。。。。。。") ;
}
} ;
public classProxyDemo{
public static void main(Stringargs[]){
Give give = newProxyGive(new RealGive()) ;
give.giveMoney() ;
}
}
最核心的就是这个代理类,它是真实的讨债人,做了真正的工作。这就是代理设计模式。
抽象类和接口(绝对重点)
2 |
比较点 |
抽象类 |
接口 |
1 |
组成 |
抽象方法、、普通方法、构造方法、常量、变量、全局常量 |
抽象方法、全局常量 |
2 |
定义 |
Abstract |
Interface |
3 |
子类 |
通过extends继承抽象类 |
通过implements实现接口 |
4 |
限制 |
一个子类只能继承一个抽象类 |
一个子类可以实现多个接口 |
5
|
关系 |
一个抽象类可以实现多个接口, |
但是一个接口不能实现继承一个抽象类。只能实现多个接口。 |
一个抽象类中可以包含多个接口 |
一个接口中可以包含多个抽象类 |
||
6 |
设计 |
模板设计 |
工厂设计、代理设计 |
两个一起操作可以完成适配器设计模式。 |
|||
7 |
实例化 |
都是通过对象的多态性,通过子类进行对象的实例化操作 |
|
8 |
实现限制 |
存在单继承局限 |
不存在此类局限 |
9 |
特性 |
|
表示一个标准,一种能力 |
从以上表格可以看出,如果抽象类和接口同时都可以使用的话优先使用接口,因为接口可以避免单继承的局限。