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

作者: ghwaphon | 来源:发表于2016-09-11 18:17 被阅读127次

    适配器模式

    什么是适配器模式呢?比如说客户端中需要一个Sort() 函数,它可以实现简单的排序功能,但是这个时候,我们发现我们之前曾经写过这个函数,而且已经打包到一个功能类里,而且该函数的名字为SimpleSort(),这个时候我们肯定不想再去实现一遍,如果能直接使用这个SimpleSort()就在好不过了,适配器就是用来完成这项工作的。

    适配器中有三个角色

    1.Target类 : 用来定义客户端需要的调用的接口,可以是抽象类,接口或者具体类。

    2.Adapter : 适配器类,用来调用另一个接口,主要功能是对Adaptee 和 Target 进行适配。

    3.Adaptee : 适配者类,包含着 Target 中需要的接口。

    适配器又包含两种不同的模式 :

    1.对象适配器模式

    public abstract class Target {
    
        public abstract void method();
    }
    
    public class Adaptee {
        public void simpleMethod(){
        
            System.out.println("Methods");
        }   
    
    }
    
    public class Adapter extends Target{
    
        private Adaptee mAdaptee;
    
        public Adapter(Adaptee adaptee) {
            this.mAdaptee = adaptee;
        }
        @Override
        public void method() {
            mAdaptee.simpleMethod();
        }
                
    }   
    

    2.类适配器模式
    这个时候Target必须是一个接口,否则将无法使用类适配器模式

    public interface Target {
    
        public void method();
    }
    
    public class Adapter extends Adaptee implements Target{
    
        @Override
        public void method() {
            simpleMethod();
        }   
    
    }
    

    适配器模式还存在两种特殊情况

    1.双向适配器模式

    如果适配器中同时包含对目标类和适配者类的引用,适配者可以通过它调用目标类中的方法,目标类也可以通过它调用适配者类中的方法。但是这个时候我们需要Adaptee 和 Target二者皆为接口,其实这并不难,只不过是在interface中定义方法,具体实现放到子类中去实现即可。

    public class Adapter implements Adaptee,Target{
    
        private Target mTarget;
        private Adaptee mAdaptee;
        public Adapter(Target target,Adaptee adaptee) {
            this.mAdaptee = adaptee;
            this.mTarget = target;
        }
    
        @Override
        public void method() {
            mAdaptee.simpleMethod();
        }
    
        @Override
        public void simpleMethod() {
            mTarget.method();
        }
    
    }
    

    2.缺省适配器模式

    缺省适配器模式的意思就是如果一个接口定义了太多的方法,而我们只需要其中一两个方法,我们可以先定义一个抽象类去实现接口,并且为接口中所有的方法提供一个默认的实现,然后我们就可以再定义一个子类去继承该抽象类,这样我们就可以在子类中复写我们想要的方法。

    public interface MethodInterface {
    
        public void method_one();
        public void method_two();
        public void method_three();
        public void method_four();
    }   
    
    public abstract class AbstractMethod implements MethodInterface{
    
        public void method_one(){
            
        }
        public void method_two(){
        
        }
        public void method_three(){
        
        }
        public void method_four(){
        
        }
    }
    public class ConcreteMethod extends AbstractMethod{
    
        public void method_one(){
            System.out.println("Method one");
        }
    
    }

    相关文章

      网友评论

        本文标题:Java 设计模式 -- 适配器模式

        本文链接:https://www.haomeiwen.com/subject/abiuettx.html