AdapterPattern(23种设计模式之一)


设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计模式六大原则(6):开闭原则

AdapterPattern,UML抽象图百度找,代码实现如下

现需要设计一个可以模拟各种动物行为的机器人Robot,在机器人中定义一系列方法,如机器人叫喊方法cry()、机器人移动方法move()等。如果希望在不修改已有代码的基础上使得机器人既能够像鸟Bird一样的叫和飞,又能像狗Dog一样的叫和跑,使用适配器模式进行系统设计并编程实现

首先,先来先讲讲适配器。适配就是由“源”到“目标”的适配,而当中链接两者的关系就是适配器。它负责把“源”过度到“目标”。在这个例子中,有一个“源”是一机器人对象,他拥有2种技能分别是叫喊和移动,而现在需要机器人变成鸟和狗,好了,现在我们的任务就是要将机器人这个“源”适配到这个岗位中,如何适配呢?显而易见地我们需要为机器人添加一个飞或者跑的方法,这样才能满足不同目标的需要

适配器模式有2种,第一种是“面向类的适配器模式”,第二种是“面向对象的适配器模式”

面向类的适配器模式代码实现

源类

package AdapterPattern;
public class RobotSource {
	public void cry(){
		System.out.println("cry");
	}
	public void move(){
		System.out.println("move!");
	}
}

目标接口

package AdapterPattern;
public interface Bird {
	public void cry();
	public void fly();
}
package AdapterPattern;
public interface Dog {
	public void cry();
	public void run();
}

适配器类

package AdapterPattern;
public class BirdRobotAdapter extends RobotSource implements Bird{
	@Override
	public void fly() {
		System.out.println("bird fly");
	}
}
package AdapterPattern;
public class DogRobotAdapter extends RobotSource implements Dog{
	@Override
	public void run() {
		System.out.println("dog run");
	}
	
}

面向对象的适配器模式

适配器类

只有适配器的差别,其他同上
package AdapterPattern;
public class BirdRobotAdapter implements Bird{
	RobotSource robot;
	public BirdRobotAdapter(RobotSource robot){
		this.robot = robot;
	}
	@Override
	public void cry() {
		robot.cry();
	}

	@Override
	public void fly() {
		System.out.println("bird fly");
	}
}
package AdapterPattern;
public class DogRobotAdapter implements Dog{
	RobotSource robot;

	public DogRobotAdapter(RobotSource robot){
		this.robot = robot;
	}
	@Override
	public void cry() {
		robot.cry();
	}

	@Override
	public void run() {
		System.out.println("dog run");
	}
	
}

分析

1.类的适配模式用于单一源的适配,由于它的源的单一话,代码实现不用写选择逻辑,很清晰;而对象的适配模式则可用于多源的适配,弥补了类适配模式的不足,使得原本用类适配模式需要写很多适配器的情况不复存在,弱点是,由于源的数目可以较多,所以具体的实现条件选择分支比较多,不太清晰。
2.适配器模式主要用于几种情况:(1)系统需要使用现有的类,但现有的类不完全符合需要。(2)讲彼此没有太大关联的类引进来一起完成某项工作(指对象适配)。

最后,再来顺带谈谈默认适配器模式:这种模式的核心归结如下:当你想实现一个接口但又不想实现所有接口方法,只想去实现一部分方法时,就用中默认的适配器模式,他的方法是在接口和具体实现类中添加一个抽象类,而用抽象类去空实现目标接口的所有方法。而具体的实现类只需要覆盖其需要完成的方法即可。例如一个人的技能与工作岗位的适配过程,代码如下:

接口类

public interface Job {  
    public abstract void speakJapanese();  
    public abstract void speakEnglish();  
    public abstract void speakFrench();  
    public abstract void speakChinese();     
}  

抽象类

public abstract class JobDefault implements Job{  
    public void speakChinese() {  
          
    }  
    public void speakEnglish() {  
          
    }  
    public void speakFrench() {  
          
    }  
    public void speakJapanese() {  
          
    }   
}

实现类

public class JobImpl extends JobDefault{  
    public void speakChinese(){  
        System.out.println("I can speak Chinese!");  
    }    
}  

别嫌弃我没写注释,这个代码很简单,注释省略,嘿嘿。
posted @ 2017-03-24 08:30  纪伟  阅读(683)  评论(0编辑  收藏  举报