อะแดปเตอร์ แพตเทิร์น

อะแดปเตอร์แพตเทิร์น (Adapter pattern) หรือ แร็ปเปอร์แพตเทิร์น (wrapper pattern) หรือเรียกสั้นๆว่า แร็ปเปอร์ (wrapper) เป็นดีไซน์แพตเทิร์นที่ใช้ในกรณีที่ รูปแบบการเชื่อมต่อของคลาสผู้เรียกและผู้ถูกเรียก ไม่สัมพันธ์กัน ดังนั้นจึงต้องใช้อะแดปเตอร์คลาสเข้ามาช่วยเป็นตัวกลาง ทำการเชื่อมต่อให้สามารถมาเรียกใช้งานกันได้

โครงสร้างอะแด๊ปเตอร์แพตเทิร์น 
                                                          
จากรูป ผู้เรียก (target) ต้องการเรียกใช้งาน เม็ทธอด SpecificRequset() แต่ไม่สามารถเรียกโดยตรงได้ เนื่องจากรูปแบบการเชื่อมต่อไม่สัมพันธ์กัน ดังนั้นจึงสร้าง คลาส Adapter มาเพื่อเรียกใช้งานผ่าน เม็ทธอด Request() ให้ไปเรียก เม็ทธอด SpecificRequest() อีกต่อหนึ่ง

ตัวอย่างการใช้อะแด๊ปเตอร์แพตเทิร์น 
                                       
ตัวอย่างที่โปรแกรมที่แสดง เป็นวิธีการนำอะแดปเตอร์แพตเทิร์นมาใช้งานจริง โดยสมมุติว่า มีแลปทอปอยู่เครื่องหนึ่ง ในการเปิดใช้งานต้องใช้ไฟฟ้าแรงดัน 110 โวลต์ แต่ไฟฟ้าที่บ้านแรงดัน 220 โวลต์ ดังนั้นจึงต้องใช้อะแดปเตอร์เข้ามาช่วย 

class MainApp {
      public static void main(String[] args) {

    	  LapTop mylabtop = new LapTop(new Adapter(new Power(220)));
    	  mylabtop.powerOn();

      }
}

แสดงการสร้างอินสแตนท์ของ คลาส LabTop โดยจะทำการสร้างอินสแตนท์ของคลาส Power กำหนดแรงดันให้เป็น 220 โวลต์ ขึ้นมาก่อน และนำอินสแตนท์ที่ได้นั้นไปสร้าง อินสแตนท์ของอะแดปเตอร์เพื่อทำการแปลงแรงดันไฟฟ้าเป็น 110 โวลต์ จากนั้นนำอินสแตนท์ของคลาสอะแดปเตอร์ที่แปลงแล้ว ไปสร้างอินสแตนท์ของ คลาส Laptop อีกที สุดท้ายสั่งเปิดเครื่อง หากใช้ขนาดแรงดันไฟฟ้าถูก จะแสดงคำว่า Power On ขึ้นมา

class LapTop {

	private int laptopvoltage;
	private Target target;

	LapTop(Target t) {
		target = t;
		laptopvoltage = target.getVoltage();
	}
	public void powerOn() { 
		if(laptopvoltage == 110)
			System.out.println("Power On"); 
		else
			System.out.println("Over Voltage");
	}
}

แสดง คลาส LapTop ซึ่งจะไปเรียก เม็ทธอด getValtage() ผ่านตัวแปร target 

abstract class Target {
	abstract public int getVoltage();
}

class Adapter extends Target {

	private Power adaptee;

	public Adapter(final Power a) {
		adaptee = a;
	}
	public int getVoltage() {
		return adaptee.getVoltage()/2;
	}
}

แสดง การสร้างคลาส Adapter ซึ่งสืบทอดมาจากแอ็บสแตรกคลาส Target และทำการ override เม็ทธอด getVoltage ขึ้นมา ซึ่งทำหน้าที่แปลงแรงดันไฟฟ้า 220 โวลต์เป็น 110 โวลต์

class Power {

	private int voltage;

	Power(int voltage) {
		this.voltage = voltage;
	}
	public int getVoltage() {
		return voltage;
	}
  }

แสดงคลาส Power ซึ่งมีคอนสตรัคเตอร์ ที่กำหนดค่าแรงดันไฟฟ้าได้ และมีเม็ทธอด getValtage ที่ส่งค่าระดับแรงดันไฟฟ้าออกมา

อ้างอิง 
 http://xnanoob.exteen.com/20080416/adapter-pattern 
 http://en.wikipedia.org/wiki/Adapter_pattern

แหล่งข้อมูลอื่น 
 http://www.vbdotnetheaven.com/UploadFile/rajeshvs/AdapterPattern05272005031848AM/AdapterPattern.aspx  Adapter Pattern in VB.NET
 http://www.c-sharpcorner.com/UploadFile/rajeshvs/AdapterPatternInCS11142005005135AM/AdapterPatternInCS.aspx Adapter Pattern in C#