上课的时候不能撸其它代码,只能看下java设计模式的书,网上也有很多总结好的,但觉得自己总结一遍能收获的更多,下来慢慢总结下这些设计模式。之所以叫接口型模式,是因为这些设计模式都需要用到Interface。
适配器模式的意图
使用不同接口的类所提供的服务为客户端提供它所期望的接口
Adapter之类的适配器
比如一个客户找到黑猫要一件衣服,要求这件衣服必须要有拉链,扣子,高领(interface),但是黑猫我呢只有模板是拉链和扣子的(现有具体类),没有高领的,但是如果重新定义满足客户的要求的工作是很麻烦的,而且浪费空间,不能重用,那么现在就要用到类的适配器了,就是我们再弄一个子类来适配现有类(模板)去满足这个interface,关系图太麻烦,小长我还在学习中啊,直接写个代码总结吧
客户要求的功能(interface)
public interface Client {
public void laLian();
public void kouZi();
public void gaoLin();
}
黑猫小长现在有的模板(现有类)
//看嘛,现在是不是没有高领,客户不干啊
public class NowHave {
public void laLian(){
System.out.println("我有拉链");
}
public void kouZi(){
System.out.println("我有扣子");
}
}
弄个小弟来适配现有模板去满足客户
//你要满足,肯定要实现这个接口涩,利用现有的模板当然要继承他了,最后
public class Adapter extends NowHave implements Client{
@Override
public void gaoLin() {
// TODO Auto-generated method stub
System.out.println("我有高领了");
}
}
测试一下
//多态的知识,就满足了
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Client cl = new Adapter();
cl.gaoLin();
cl.kouZi();
cl.laLian();
}
}
Adapter之对象适配器
就是咱们可以间接利用适配器类去用咱有现有类的实例,比如咱们现有模板有一个方法是吧,但是客户要求的方法呢和这个名字不一样,但是要用到模板里的这个方法,咱就用适配器类来返回现有类的实例,通过这个实例调用这个需要用到的方法。直接上个例子:
要求类
//客户要求的内容
public abstract class RequredClass {
public abstract String requiredMethod();
}
黑猫现在有的,并且是客户要求的可以用到的
//俺现在有的类,里面有个方法呢是要求类要用到的
public class ExistClass {
public String userfulMethod(){
/*
*内容
*/
return null;
}
}
适配呗
//咱们来适配
public class Adapter extends RequredClass{
//既然是对象适配器,要用到已有类的对象涩,定义一个先
private ExistClass existClass;
public Adapter(ExistClass existClass){
this.existClass = existClass;
}
@Override
public String requiredMethod() {
// TODO Auto-generated method stub
return existClass.userfulMethod();
}
}
对象适配器更加脆弱
为啥子呢?对象适配器,俺们的适配器类没有继承接口,没有接口的约束,可能在运行时出现编译时无法检测到的问题,而且俺们不能想访问现有类的属性或方法,不能保证咱们现有类的属性或方法的声明方式,很难约束控制它们要做的事情。
Adapter之缺省适配器
就是客户本来要求很多功能,但是现在只需要一个功能了,不多说,直接上代码
要求的接口
//目标接口
public interface Target {
public void method1();
public void method2();
public void method3();
}
再定义一个类继承上面的(只是一个中间过渡类)
public class GuoDu implements Target{
//所有方法不必去实现
@Override
public void method1() {
// TODO Auto-generated method stub
}
@Override
public void method2() {
// TODO Auto-generated method stub
}
@Override
public void method3() {
// TODO Auto-generated method stub
}
}
客户只要method3的功能,咱们就只有method3涩
public class FunctionClass extends GuoDu {
public void method3(){
/*
* 具体功能
* */
}
}
再来一个测试类
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Target target = new FunctionClass();
target.method2();
}
}
//你去调用method1和method2是没有效果的,因为俺们的功能类没有实现这个,这就是需要哪个,咱就重写哪个方法
Adapter应用场景
如果一个抽象类或者接口的话,就必须要重写所有的抽象方法。
那么,如果一个接口中定义的抽象方法过多,而子类中很多抽象方法又不需要用到,就应该设计一个适配器。在JAVA的GUI编程中,jdk就自动封装了多个适配器。比如: windowAdapter。