美文网首页
适配器模式

适配器模式

作者: yuzhiyi_宇 | 来源:发表于2019-03-02 17:04 被阅读0次

    适配器模式(Adapter),将一个类的接口转接成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作。

    适配器模式结构图

    适配器模式中的角色:

    • Target:需要得到的类,客户所期待的接口。目标可以是具体的或抽象的二类,也可以是接口。
    • Adaptee:需要适配的类。
    • Adapter:适配器类,将源接口装换成目标接口。

    适配器模式简单实现

    适配器模式分为类适配器模式、对象适配器模式、接口适配器模式。

    1. 类适配器模式简单实现

    (1)需要适配的类

    public class AC110 {
    
      public void output110V() {
         System.out.println("输出110V");
      }
    }
    

    (2)需要得到的类

    public interface AC220 {
        void output220() ;
    }
    

    (3)适配器类

    public class Adapter extends AC110 implements AC220 {
    
        @Override
        public void output220() {
            super.output110V();
        }
    }
    

    (4)客户端调用

    public class Client {
        public static void main(String[] args) {
            AC220 ac220 = new Adapter();
            ac220.output220();
        }
    }
    

    2. 对象适配器模式

    (1) 适配器类

    public class Adapter implements AC220 {
    
        private AC110 mAc110;
    
        public Adapter(AC110 ac110) {
            this.mAc110 = ac110;
        }
    
        @Override
        public void output220() {
            mAc110.output110V();
        }
    }
    

    (2)客户端调用

    public class Client {
        public static void main(String[] args) {
            AC220 ac220 = new Adapter(new AC110());
            ac220.output220();
        }
    }
    

    3. 接口适配器模式

    (1)需要得到的类

    public interface ACOutput {
    
        void output5V();
    
        void output220V();
    
        void output330V();
    }
    

    (2) 适配器类

    public class ACAdapter implements ACOutput {
    
        private AC110 mAc110;
    
        public ACAdapter(AC110 ac110) {
            this.mAc110 = ac110;
        }
    
        @Override
        public void output5V() {
            mAc110.output110V();
        }
    
        @Override
        public void output220V() {
            mAc110.output110V();
        }
    
        @Override
        public void output330V() {
            mAc110.output110V();
        }
    }
    
    public class AC220Adapter extends ACAdapter{
    
        public AC220Adapter(AC110 ac110) {
            super(ac110);
        }
    
        @Override
        public void output220V() {
            super.output220V();
        }
    }
    

    (3) 客户端调用

    public class Client {
        public static void main(String[] args) {
            AC220Adapter ac220Adapter = new AC220Adapter(new AC110());
            ac220Adapter.output220V();
        }
    }
    

    适配器模式的使用场景

    • 系统需要使用现有的类,但现有的类却不兼容。
    • 需要建立一个可以重复使用的类,用于一些彼此关系不大的类,并易于扩展,以便于面对将来会出现的类。
    • 需要一个统一的输出接口,但是输入类型却不可预知。

    适配器模式的优缺点

    优点:

    • 将目标类和适配者类解耦。
    • 增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性。
    • 灵活性和扩展性都非常好,符合开闭原则。

    类适配器还有的优点:
    由于适配器类是适配者类的子类,因此可以再适配器类中置换一些适配者的方法,使得适配器的灵活性更强。

    类适配器的缺点:
    对于Java、C# 等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为接口,不能为类,其使用有一定的局限性,不能将一个适配者类和他的子类同时适配到目标接口。

    对象适配器还有的优点:
    把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和他的子类都适配到目标接口。

    对象适配器的缺点:
    与类适配器模式相比,要想置换适配者类的方法就不容易。

    适配器模式与代理模式的区别:
    适配器模式:是把2个不同的东西转换到可以正常使用,适配器是去迎合目标对象与源对象。
    代理模式:是2个对象都有相同的功能,2者接口是一样的。

    相关文章

      网友评论

          本文标题:适配器模式

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