适配器模式 设计原则:遵循开闭原则、体现功能复用常用场景:需要使用一个类的功能,但是该类的接口不符合使用场合要求的接口,可使用定制适配器,又或者是有一个接口定义的行为过多,则可以定义一个缺省适配器,让子类选择性的覆盖适配器的方法使用概率:40%复杂度:中变化点:无选择关键点:定制适配器的选择关键点在于是否有更加优良的替代方案,缺省适配器的选择关键点在于接口中的方法是否可以不全部提供,且都有缺省方案逆鳞:无相关设计模式装饰器模式:对于适配器模式中的定制适配器与装饰器模式,二者都是使用组合加继承的手段,不同的是,适配器模式的目的在于适配接口,装饰器模式的目的在于动态的添加功能,且可以叠加。 主要思想1.适配器实际是一种组装、缝合,把多个接口或者类的方法提出来,封到新类中,可能是提取方法,也可能是直接持有原类的实例,这里的持有后只是调用想用的方法,不干其他事。2.使用上 2.1补救使用的,在初期的系统构建中不考虑使用。说补救是比如现在已有项目,在想用其中的某些方法,但是又想扩展符合自己新的规范或者设计却不想修改原项目中的东西,那就可以用适配器。 2.2缩减接口,在原接口或抽象类中定义的抽象方法太多,而自己想要的功能可能只是需要覆盖其中部分方法就可以,就可以做个适配类实现接口或抽象类,空实现其中的方法,那自己用时,继承适配器就可以自定义覆盖了 常见的swing中就存在大量的适配器
补救的使用1 继承组合
//其他项目中的类 不想或者不能动 但是想用do3 public class AnotherProgramClass { public void do3() { System.out.println("原项目中do3"); } public void do4() { System.out.println("原项目中do4"); } } //自己的接口 想集成上面的do3 public interface MyInterface { public void do1(); public void do2(); } //补救的适配使用 public class MyAdapter extends AnotherProgramClass implements MyInterface { @Override public void do1() { System.out.println("适配do1"); } @Override public void do2() { System.out.println("适配do2"); } @Override public void do3() { System.out.println("适配do3"); } }
补救的使用2 持有类实例但是要考虑原类的一些状态对不对问题
public class MyAdapter implements MyInterface { private AnotherProgramClass obj; //这里要注意obj的一些属性状态等 是不是自己想要的 public MyAdapter(AnotherProgramClass obj) { this.obj = obj; } @Override public void do1() { System.out.println("适配do1"); } @Override public void do2() { System.out.println("适配do2"); } public void do3() { obj.do3(); } }
缩减接口
public interface MyInterface { public void do1(); public void do2(); public void do3(); public void do4(); public void do5(); } //使用时 继承该类 自定义覆盖就可以了 public class MyAdapter implements MyInterface { @Override public void do1() { } @Override public void do2() { } @Override public void do3() { } @Override public void do4() { } @Override public void do5() { } }
时间: 2024-10-27 09:30:08