• 5.3 适配器模式(4.1)


    适配器模式(adapter pattern),又名包装器(Wrapper),是一种“伪装式”委派方式。

    问题描写叙述:假定接口Being(生命) 有抽象方法eat()、run(),它的实现类有人/Person、狗/Dog等等;
    现有 (第三方) 已经存在的鸟/Bird类,可是Bird拥有的方法头/接口不同样,如eat()和fly();
    再比方,程序猿希望将汽车/Car、机器人/Robot……(其它一些你能够想象出来的东西)也“作为”Being来统一处理,当然,它们拥有的方法头/接口各不同样,比如Car有加油/refuel()方法等。

    因为希望将Bird、Car、Robot……伪装成为Being以便统一处理,能够将“已经存在的类”再次包装一下,其包装类BirdWrapper、CarWrapper、RobotWrapper等等作为Being的子类。也就是说,外界将BirdWrapper作为Being,而实际上使用了遗留的Bird。

    package delegate.adapter;
    public class Client{
        public static void main(String args[])	{
    		Being b= new BirdWrapper();
    		b.eat();
    		b.run();
    	}
    }
    
    easy想象,BirdWrapper改写Being的eat()、run()方法时,将消息转发给被包装的类Bird的相应方法。再比如CarWrapper的eat()实现将调用Car的加油/refuel()方法。

    5.3.1 转发的方式

    包装类BirdWrapper与遗留类的Bird,既能够是Is-A的继承关系,也能够Has-A的组合关系。

    1. Is_A型适配器

    当BirdWrapper是一个Bird,意味着Being和Bird均为适配器类BirdWrapper的父类型。通常遗留的Bird是一个类,所以Being必须是一个Java接口。

    package delegate.adapter;
    public class Bird{
        public void eat(){
    		System.out.println("Bird.eat()");
    	}
    	
    	public void fly()	{
    		System.out.println("Bird.fly()");
    	}
    }
    package delegate.adapter;
    public class BirdWrapper extends Bird implements Being {
    	@Override public void eat()	{ //此方法能够省略
    		super.eat();
    	}	
    	@Override public void run()	{
    		super.fly(); // super.能够省略
    	}
    }
    

    Is-A型适配器,在《设计模式》中叫做类适配器。因为採用继承关系,要求Bird类不得为final类——否则无法继承、Bird与Being不得同一时候为类——Java不支持类的多继承。

    现有类Bird的方法体是我们须要的,BirdWrapper能够使用改进语义的override——在调用super.eat()的基础上加入型的代码。

    被适配的类Bird应该是一个该详细的类。如果Bird有各种子类如麻雀、鸽子等,BirdWrapper将与麻雀、鸽子同等地位,Is-A型适配器无法适配麻雀、鸽子,这时须要使用Has-A型适配器。

    2. Has-A型适配器

    package delegate.adapter;
    public interface Robot{
        public void battery();//电池充电
        public void move();
    }
    package delegate.adapter;
    public class RobotWrapper implements Being{
        private Robot r;
        public RobotWrapper(){
            //任一创建对象的模式        
        }
        @Override public void eat()	{
    		r.battery();//
    	}	
    	@Override public void run()	{
    		r.move();
    	}
    }
    

    Has-A型适配器,在《设计模式》中叫做对象适配器。因为採用委派关系,被适配的类如Robot能够是一个Java接口或抽象类,Robot拥有自己的类层次。



    在[2.1.1空方法的作用]中,介绍了一种伪适配器——JDK中各种窗体控件适配器。值得注意的是,伪适配器模式中,各个类本身构成类层次;而适配器模式中,被适配者通过适配器“伪装”成目标类型(Being)。

    双向适配器




  • 相关阅读:
    php2
    11-14php
    三层嵌套
    常见的浏览器兼容
    css中的一些问题及解决方法
    css
    html
    测试题
    正则表达式
    Math对象
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4004874.html
Copyright © 2020-2023  润新知