出处: https://www.jianshu.com/p/a0e3ad966888
设计模式就是前人将自己编写代码的经验总结出来,通过代码的逻辑编写符合大多数场景的业务开发的硬编码。就是一个通用的解决方案。是一种问题解决的思路,不是固定的写法。
常见的三种适配的方式,类适配器、对象适配器、接口适配器。根据使用场景,我们这里主要分析接口适配器。
适配器模式中的接口适配器主要解决接口和实现类之间的继承冲突问题。
1:使用抽象类分离接口和实现类
2:抽象类中分摊编写实现类中不需要实现的方法
3:是的实现类只需要实现自己需要的方法即可
//学生守则接口
public interface StudentRole {
// 定义学生守则接口的规范
void signature(int score);
// 定义学生守则的第二个规范
void witchMovie();
}
public abstract class WangUncle implements StudentRole{
@Override
public void signature(int score) {
if(score<60){
System.out.println("王叔叔帮忙签字");
}
}
/*
@Override
public void witchMovie() {
System.out.println("王叔叔代替我看电影");
}*/
}
public class Student extends WangUncle{
private int score;
public Student(int score) {
this.score = score;
}
public Student() {
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public void witchMovie() {
System.out.println("吃着爆米花,带着小女生一起看电影");
}
}
public class Test01 {
public static void main(String[] args) {
//测试使用Student 查看是否
Student stu1 = new Student(50);
stu1.signature(stu1.getScore());
stu1.witchMovie();
}
}
#### 1-5-4:参考Servlet中的GenericServlet类
public abstract class MagaGenericServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
ps:抽象类继承Servlt,对于需要实现的内容进行空实现。
@WebServlet("/login")
public class LoginServlet1 extends MagaGenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("我被执行了");
}
}
[2018-12-14 02:51:37,595] Artifact webadapter:war exploded: Artifact is deployed successfully
[2018-12-14 02:51:37,595] Artifact webadapter:war exploded: Deploy took 738 milliseconds
我被执行了
i:Servlet和GenericServlet类之间
ii:java.io.InputStreamReader(InputStream is)
You don’t call me,I’ll call you back;
1:算法、业务骨架固定,核心业务或者常被改变的代码延迟到子类实现。更加利于扩展。
2:父类控制子类中的执行流程
1:使用父类,可以是抽象类。将核心业务方法进行抽象。在程序中通过***final***修饰核心的流程业务。
2:编写具体子类,无法重写父类中的***final***方法
3:调用子类方法时,处理处理流程还是父类的
public abstract class Father {
void study(){
System.out.println("day day up good good study");
}
void working(){
System.out.println("love working");
}
abstract void fallInLove();
final void life(){
study();
working();
fallInLove();
}
}
public class Son extends Father{
void study(){
System.out.println("随便学学");
}
void working(){
System.out.println("这个不是主要的。。。");
}
void fallInLove(){
System.out.println("be faithful to one's huasband unto death");
}
}
public class Test {
public static void main(String[] args) {
Father f = new Son();
f.life();
Father f1 = new Father() {
@Override
void fallInLove() {
System.out.println("don't fallINLove,new ");
}
};
f1.life();
}
}
随便学学
这个不是主要的。。。
be faithful to one's huasband unto death
day day up good good study
love working
don't fallINLove,new
PS:通过以上案例,我们能够清楚的发现,子类将父类中的一些核心代码可以延迟到后期实现。且父类已经指定了整个业务的执行顺序。开发时只需要考虑方法的具体实现,而不是何时被调用。
public abstract class MageHttpServlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//判定用户发送的请求
HttpServletRequest request = (HttpServletRequest)servletRequest;
String method = request.getMethod();
//根据用户请求确定调用的方法
if("GET".equalsIgnoreCase(method)){
this.doGet(servletRequest,servletResponse);
}else if ("".equalsIgnoreCase(method)){
this.doPost(servletRequest,servletResponse);
}
}
public abstract void doGet(ServletRequest req,ServletResponse resp);
public abstract void doPost(ServletRequest req,ServletResponse resp);
}
ps:在service方法中定义好预先要执行的是doGet或者是doPost
@WebServlet("/login")
public class LoginServlet extends MageHttpServlet {
public void doGet(ServletRequest req,ServletResponse resp){
System.out.println("do Get invoke login");
}
public void doPost(ServletRequest req,ServletResponse resp){
}
}
只需要确定执行的方法具体的是哪个即可,不需要关注是谁调用的
[2018-12-14 04:35:35,467] Artifact webTemplate:war exploded: Artifact is deployed successfully
[2018-12-14 04:35:35,468] Artifact webTemplate:war exploded: Deploy took 740 milliseconds
do Get invoke login
i: HttpServlet
ii:Spring中JDBCTemplate等
iii:Junit单元测试
更多Java资料获取,请添加码歌悠悠qq: 1811119218
转载自:简书
作者:码歌老薛