设计模式适配器模式
Posted oeleven
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式适配器模式相关的知识,希望对你有一定的参考价值。
适配器模式可以将一个类的接口,转换成客户期望的另外一个接口,让原本接口不兼容的类可以合作无间。
现在我们有一个电视的类,新版电视的开关接口和老版电视的开关是不一样的,客户想要接着用老版电视的开关模式来操作新版电视,这时候就能用适配器模式来解决这个问题。
适配器模式可以分为对象适配器、类适配器和接口适配器三种,接下来先看看对象适配器,对象适配器是重新创建一个适配器类,实现了原先接口的方法,同时有一个新版电视对象,实现原先接口中的方法调用新版电视的方法。
我们设计一个NewTVAdapter的对象,实现TV接口,然后去调用NewTV的方法,具体代码如下
public interface TV { public void on(); public void off(); }
public class OldTV implements TV { @Override public void on() { System.out.println("打开了老式电视!"); } @Override public void off() { System.out.println("关闭了老式电视!"); } }
public class NewTV { public void onTV() { System.out.println("打开了新款电视!"); } public void offTV() { System.out.println("关闭了新款电视!"); } }
public class NewTVAdapter implements TV { private NewTV newTV; public NewTVAdapter(NewTV newTV) { this.newTV = newTV; } @Override public void on() { newTV.onTV(); } @Override public void off() { newTV.offTV(); } }
测试代码
public static void main(String[] args) { TV tv1 = new OldTV(); tv1.on(); tv1.off(); NewTV newTV = new NewTV(); tv1 = new NewTVAdapter(newTV); tv1.on(); tv1.off(); }
测试结果
还有一种类适配器,创建一个适配器类,继承新版电视,同时实现老版开关的接口,接口方法里调用父类的开关方法
其他代码一样,就是适配器代码有所改变
public class NewTVAdapterClass extends NewTV implements TV { @Override public void on() { super.onTV(); } @Override public void off() { super.offTV(); } }
测试代码
public static void main(String[] args) { TV tv1 = new OldTV(); tv1.on(); tv1.off(); tv1 = new NewTVAdapterClass(); tv1.on(); tv1.off(); }
测试结果
还有一种接口适配器,它只有某一个或者某几个方法,对其他的方法并不关心。(当然作为一个电视,只有一个关闭功能显然不合理,这里只是做一个例子)
代码如下
public abstract class NewTVAdapterAbstract implements TV { @Override public void on() { } @Override public void off() { } }
public class NewTV2 extends NewTVAdapterAbstract{ @Override public void off() { System.out.println("新版的关闭方式!"); } }
测试代码
public static void main(String[] args) { TV tv1 = new OldTV(); tv1.on(); tv1.off(); tv1 = new NewTV2(); tv1.on(); tv1.off(); } }
测试结果
适配器模式将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无需修改原有结构,增加了类的透明性和复用性,扩展性很好。
以上是关于设计模式适配器模式的主要内容,如果未能解决你的问题,请参考以下文章