资讯专栏INFORMATION COLUMN

Java 23种设计模式----适配器模式

VincentFF / 2669人阅读

摘要:适配器模式的结构通过继承实现通过委让实现代码实现目标类使用数据线适配类使用转适配线主函数与在适配器模式中的应用当前,不少公司使用整合进行系统开发。

Java 23种设计模式----适配器模式

1、面向对象OO = 面向对象分析OOA + 面向对象设计OOD + 面向对象编程OOP

2、编程是一门技术、同时也是一门艺术

3、应该面向接口编程,而不是面向实现编程

什么是设计模式

设计模式是一种被反复使用、多数人知晓的、代码设计经验的总结。使用设计模式是为了可重用代码,让代码更容易被别人理解、保证代码的可靠性。

设计模式原则

1、开闭原则(Open Closed Principle,OCP)是指:软件实体应当对扩展开放,对修改关闭。这个概念是大师Bertrand Meyer在1988年提出的,我们可以把开闭原则理解成----可以根据需求随意增加新的类,但不要修改原来的类

2、单一职责原则(Single Responsibility Principle,SRP)是指:就一个类而言,应该仅有一个引起它变化的原因。换言之,一个类,只需按职责进行功能设计。此原则从软件工程师角度分析,符合“高内聚,低耦合”的标准。并且,我们在接口设计及方面也同样符合单一职责的设计原则

3、里氏替换原则(Liskov Substitution Principle,LSP)它的完整表达是:若对每个类型S的对象o1,都存在一个类型T的对象o2,使得在所有针对编写的程序P中用o1替换o2后,程序P的行为功能不变,则S是T的子类型。

4、依赖倒转(Dependence Inversion Principle DIP)定义一:高层模块不应该依赖低层模块,二着都应该依赖于抽象。抽象不应该依赖于细节,细节应当依赖于抽象。定义二: 要针对接口编程,不要针对实现编程

5、接口隔离原则简称ISP(Interface Segregation Principle)。定义一:不应该强迫客户依赖于他们不用的方法,定义二:一个类对另一个类的依赖性应当是建立在最小的接口上。

6、迪米特法则(Law of Demeter)又叫最少知识原则,它是指一个对象应当由其他对象有尽可能少的了解,不必与不相识的人直接联系。

适配器模式

简单来说就是把一个类的接口转换成我们所希望的接口,使原来不能一起工作的两个类能在一起工作。比如生活中的电源适配器,DP转HDMI线、Type-C转USB。

1、适配器种类

1、类适配器是通过继承类适配来实现的,另外类适配器实现客户类所需的接口。当客户端调用适配器类方法时,适配器内部调用它所继承的适配者的方法。

public class Adapter extends Adapteree implements Target {
  public void request() {
    this.doXxx();
  }
}

2、对象设配器包含一个适配器者的引用,与类适配器相同,对象适配器也实现了客户端所需的接口,当客户对象调用对象适配器的方法时,对象适配器调它所包含的适配器者实例的方法。

public class Adapter implements Target {
  Adapteree adapteree = new Adapteree();
  public void request() {
    adapteree.doXxx();
  }
}

对于两种不同的适配客户端代码其实是一样的,

public class Client {
  public static void main(String ... args) {
    Target t = new Adapter();
    t.doXxx();
  }
}
2、适配器模式应用场景

我们需要实现某些功能,这些功能已有还不太成熟的一个或多个外部组件,如果我们自己重新开发这些功能会花费大量时间;所以很多情况下会选择先暂时使用外部组件,以后再考虑随时替换。但这样一来,会带来一个问题,随着对外部组件库的替换,可能需要对引用该外部组件的源代码进行大面积的修改,因此也极可能引入新的问题等等。如何最大限度的降低修改面呢

Adapter模式就是针对这种类似需求而提出来的。

Adapter模式通过定义一个新的接口(对要实现的功能加以抽象),和一个实现该接口的Adapter(适配器)类来透明地调用外部组件。这样替换外部组件时,最多只要修改几个Adapter类就可以了,其他源代码都不会受到影响。

3、适配器模式的结构

1、通过继承实现Adapter

2、通过委让实现Adapter

4、代码实现

目标类

public class Target {
    public void useTyper_C() {
        System.out.println("使用Type-C数据线");
    }
}

适配类

/**
 * Created by guo on 19/2/2018.
 *
 */
public class Adapter extends Target {
    private Target target;
    public Adapter(Target target) {
        this.target = target;
    }
    public void useUSB() {
        System.out.println("使用Type-C转USB适配线");
        this.target.useTyper_C();
    }
}

主函数

/**
 * Created by guo on 19/2/2018.
 */
public class MainClass {
    public static void main(String[] args) {
       Adapter adapter = new Adapter(new Target());
       adapter.useUSB();
    }
}
5、Spring与Hibernate在适配器模式中的应用

当前,不少公司使用Spring整合Hibernate进行系统开发。对于Spring而言,它提供了HibernateDaoSupport、HibernaterTemplate、HibernateCallBack等工具类或接口来支持DAO组件的实现。

1、父DAO接口

import java.util.List;

public interface FatherDAO {
    void saveInfo(Object obj1);
    void delInfo(Object obj2);
    Object findByNo(String no);
    List findAll();
}

2、通用DAO适配器

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import java.util.List;

/**
 * Created by guo on 19/2/2018.
 * 通用DAO适配器
 */
public abstract class FatherDaoAdapter extends HibernateDaoSupport implements FatherDAO {
    protected FatherDaoAdapter() {
    }

    public void saveInfo(Object obj1) {
        getHibernateTemplate().saveOrUpdate(obj1);
    }

    public void delInfo(Object obj2) {
          getHibernateTemplate().delete(obj2 );
    }

    public List findAll(String objName) {
        String Searching = "from" + objName;
        return getHibernateTemplate().find(Searching);
    }
}

3、登录DAO接口

/**
 * Created by guo on 19/2/2018.
 * 登录Dao接口
 */
public interface LoginDao extends FatherDAO {
    List findByName(String name);
    List findByPassWord(String password);
}

4、登录DAO实现类

import java.util.List;

/**
 * Created by guo on 19/2/2018.
 */
public abstract class LoginDaoLmpl extends FatherDaoAdapter implements LoginDao {
    public static final String LOGIN = "Spring.adaper.Login";
    public static final String NAME = "guo";
    public static final String PASSWORD = "admin";

    @Override
    public List findAll() {
        return super.findAll(NAME);
    }
}
说明

1、本文参考大话设计模式、北风网教程。推荐大家看Java Web设计模式之道。

2、新手学习语言最好的方法是模仿,思考别人为啥这么写。

3、希望自己有一天也可以写出真正属于自己的文章。

4、GitHub 欢迎点赞,算是对我最大的鼓舞。

5、越努力,越幸运。美好的事,总会在不经意间发生。2018 加油。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68505.html

相关文章

  • Java23设计模式与J2EE设计模式

    摘要:这个模式感觉一一般和工厂模式一起使用的比较多比较方便结构型模式这些设计模式关注类和对象的组合。设计模式这些设计模式特别关注表示层。 设计模式的的六大原则: 学习设计模式之前最好先了解一下设计模式的设计原则: 1. 开闭原则(open close principle) 开放即指对扩展开放,对修改关闭 简而言之,就是扩展功能的时候应该尽量的不修改原有的代码。 2. 里氏代换原则(lisko...

    andot 评论0 收藏0
  • Java设计模式概述

    摘要:设计模式的类别设计模式一共分为种类型,共种。属于结构型的设计模式适配器模式桥接模式装饰模式组合模式外观模式享元模式代理模式。问题描述了应该在何时使用设计模式。解决方案描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方式。 设计模式概述 1. 设计模式是什么 我们在平时编写代码的过程中,会遇到各种各样的问题,细想一下很多问题的解决思路大致一样的,这时候你就可以把解决问题的思路整...

    leon 评论0 收藏0
  • java 基础 - 收藏集 - 掘金

    摘要:基础知识复习后端掘金的作用表示静态修饰符,使用修饰的变量,在中分配内存后一直存在,直到程序退出才释放空间。将对象编码为字节流称之为序列化,反之将字节流重建成对象称之为反序列化。 Java 学习过程|完整思维导图 - 后端 - 掘金JVM 1. 内存模型( 内存分为几部分? 堆溢出、栈溢出原因及实例?线上如何排查?) 2. 类加载机制 3. 垃圾回收 Java基础 什么是接口?什么是抽象...

    makeFoxPlay 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<