适配器
项目中的程序如果没有使用适配器模式,假如A、B、C类直接实现接口,其中m1,m2,m3方法是需要使用的,其它方法都给默认空实现,即让这些类直接实现这个接口,需要实现更多的方法代码,丑陋不够优雅!代码丑陋!
设计模式的分类:
- 创建型:解决对象的创建问题
- 行为型:该模式与方法、行为、算法有关的设计模式
- 结构型:更多类,更多的对象组合成更大的结构解决某个特定的问题
你听说过哪些设计模式?
- Gof95(1995年,四人组提出的23种设计模式)
-
单例模式
-
工厂模式
-
适配器模式
-
迭代模式【集合】
-
策略模式【集合】
-
装饰器模式【IO流】
-
- JavaEE设计模式
GenericServlet
1、我们目前所有的Servlet类直接实现了javax.servlet.Servlet接口,但是这个接口中有很多方法是目前不需要的,我们可能只需要编写service。直接实现Servlet接口代码丑陋,有必要在中间添加一个适配器,以后所有的Servlet类不再直接实现Servlet接口,应该去维承适配器类。
2、适配器除了可以让代码优雅之外,我们还可以在适配器中提供大量的方法,子类继承之后,可以在子类中直接使用,方便编程。
下面附上一个自己编写的GenericServlet类
package myweb; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; /** * GenericServlet是一个适配器,这个适配器四十一个Servlet,以后javaweb程序员无需直接实现Servlet接口,去继承这个适配器即可。 * 然后重写service方法。 */ public abstract class GenericServlet implements Servlet { private ServletConfig config; @Override public final void init(ServletConfig config) throws ServletException { this.config = config; this.init(); } /* * 若自初始化时刻需要执行一段特殊的程序,建议重写无参数的init方法。 * */ public void init() { } @Override public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, IOException ; @Override public void destroy() { } @Override public ServletConfig getServletConfig() { return config; } @Override public String getServletInfo() { return ""; } //-------------------------------以下的所有的方法都是扩展方法,方便程序的编写------------------------------------------------------ public ServletContext getServletContext(){ return getServletConfig().getServletContext(); } //................. }
其实,SUN公司已经帮我们编写了GenericServlet类,在javax.servlet.GenericServlet中。
下面是一个HelloServlet.java类
package myweb; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; //public class HelloServlet extends GenericServlet { public class HelloServlet extends javax.servlet.GenericServlet { private static final long serialVersionUID = 1L; @Override public void init() { System.out.println("HelloServlet's init method execute"); } @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("HelloServlet's service method execute!"); } }
附、适配器模式的例子
CommIn.java
package adapter; public interface CommIn { void m1(); void m2(); void m3(); void m4(); void m5(); void m6(); void m7(); void m8(); }
Adapter.java
package adapter; /* * 缺省适配器 * */ abstract public class Adapter implements CommIn{ @Override abstract public void m1() ; @Override abstract public void m2() ; @Override abstract public void m3() ; @Override public void m4() { // TODO Auto-generated method stub } @Override public void m5() { // TODO Auto-generated method stub } @Override public void m6() { // TODO Auto-generated method stub } @Override public void m7() { // TODO Auto-generated method stub } @Override public void m8() { // TODO Auto-generated method stub } }
A.java
package adapter; public class A extends Adapter { @Override public void m1() { // TODO Auto-generated method stub } @Override public void m2() { // TODO Auto-generated method stub } @Override public void m3() { // TODO Auto-generated method stub } }
B.java
package adapter; public class B extends Adapter { @Override public void m1() { } @Override public void m2() { } @Override public void m3() { } }
C.java
package adapter; public class C extends Adapter { @Override public void m1() { } @Override public void m2() { } @Override public void m3() { } }