适配器
项目中的程序如果没有使用适配器模式,假如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() {
}
}